麻烦看下这个为什么段异常 该怎样改 这块小弟我总是晕 谢谢
麻烦看下这个为什么段错误 该怎样改 这块我总是晕 多谢
为什么我只传 head1 是不行的呢?
void *hptr 指向的到底是什么呢 麻烦帮我分析的透彻些 我总绕糊涂了 多谢
------解决方案--------------------
main()中的head1 是Node类型的结构体指针,而void create_list(void *hptr)的参数需要的是指向结构体指针的指针(Node **),即 *hptr = &head1,所以传参数要传&head1。这样做是为了能够通过传递一个变量的地址来改变那个变量的值。
而create_list(void *hptr)中void类型的*hptr 通过NODE *head1 = (PNODE)hptr;语句中的强制类型转换,转变成了一个PNODE类型的指针,它所指向的是一个Node类型的结构体。
------解决方案--------------------
首先需要理解函数参数的值传递与指针传递之间的区别
主楼的例子的中,虽然传递的是一个指针,但是你的这个操作:
PNODE head1 = NULL;
所以head1的值为NULL,没有地方可指。把head1传给create_list,create_list中使用的是head1的一个拷贝。但是main函数中的head1不会变,一直是NULL。所以使用head1->操作,肯定会segment fault。
但是上面的这个例子,指针p已经分配了内存,指向了字符指针。然后将p传给fun函数。虽然fun函数中不会改变p的值,但是p指向的内存的值在fun函数中已经变了。
#include <iostream>
using namespace std;
typedef struct __node
{
int v;
struct __node *next;
}NODE, *PNODE;
void create_list(void *hptr)
{
PNODE cur_ptr1 = NULL;
NODE *head1 = (PNODE)hptr;
PNODE cur_ptr2 = NULL;
PNODE prev = NULL;
for (int i = 0; i < 4; i++)
{
PNODE l1 = new NODE();
l1->v = i;
l1->next = NULL;
if (head1 == NULL)
{
head1 = l1;
cur_ptr1 = head1;
continue;
}
cur_ptr1->next = l1;
cur_ptr1 = l1;
}
}
int main()
{
PNODE head1 = NULL;
PNODE cur_ptr1 = NULL;
create_list(head1);
cur_ptr1 = head1;
for(int i = 0; i < 4; i++)
{
cout<<cur_ptr1->v<<endl;
cur_ptr1 = cur_ptr1->next;
}
return 0;
}
为什么我只传 head1 是不行的呢?
void *hptr 指向的到底是什么呢 麻烦帮我分析的透彻些 我总绕糊涂了 多谢
------解决方案--------------------
main()中的head1 是Node类型的结构体指针,而void create_list(void *hptr)的参数需要的是指向结构体指针的指针(Node **),即 *hptr = &head1,所以传参数要传&head1。这样做是为了能够通过传递一个变量的地址来改变那个变量的值。
而create_list(void *hptr)中void类型的*hptr 通过NODE *head1 = (PNODE)hptr;语句中的强制类型转换,转变成了一个PNODE类型的指针,它所指向的是一个Node类型的结构体。
------解决方案--------------------
首先需要理解函数参数的值传递与指针传递之间的区别
主楼的例子的中,虽然传递的是一个指针,但是你的这个操作:
PNODE head1 = NULL;
所以head1的值为NULL,没有地方可指。把head1传给create_list,create_list中使用的是head1的一个拷贝。但是main函数中的head1不会变,一直是NULL。所以使用head1->操作,肯定会segment fault。
但是上面的这个例子,指针p已经分配了内存,指向了字符指针。然后将p传给fun函数。虽然fun函数中不会改变p的值,但是p指向的内存的值在fun函数中已经变了。