尝试访问```list1-> data```时出现分段错误
segmentation fault when trying to access ```list1->data```
我是 C 的新手,所以这个问题听起来太简单了。
我试过 运行 这个简单的程序,但是遇到了分段错误:
struct list {
int data;
struct list* next;
};
void makeList(struct list* list1) {
list1 = (struct list*) malloc(sizeof(struct list));
list1->next = NULL;
}
int main(int argc, char ** argv) {
struct list * list1;
makeList(list1);
list1->data = 5;
printf("data: %d\n", list1->data);
return 0;
}
我知道问题主要出在list1->data = 5
,但为什么呢?
在我看来,函数 makeList
获取结构列表的指针并为其分配存储空间。那就是我所做的,不是吗?我通过指针传递了 list1
。为什么它表现得像 list1 未初始化之类的?为什么不起作用?
在此声明中
struct list * list1;
声明了一个未初始化的指针,因此具有不确定的值。
在这个函数的调用中makeList
makeList(list1);
传递了指针值的副本list1
。所以这个函数改变了这个值的副本而不是原始指针。 main 中声明的原始指针保持不变。
您可以通过以下方式声明和定义函数,例如
struct list * makeList( void )
{
struct list *list = malloc( sizeof( struct list ) );
if ( list != NULL ) list->next = NULL;
return list;
}
而在 main 中,函数被调用为
list1 = makeList();
另一种方法是将main中声明的指针通过引用传递给函数。在 C 中,按引用传递意味着通过指向对象的指针间接传递对象。取消引用指针,您可以访问原始对象。
例如
void makeList( struct list **list )
{
*list = malloc( sizeof( struct list ) );
if ( *list != NULL ) ( *list )->next = NULL;
}
并且该函数被调用为
makeList( &list1 );
我是 C 的新手,所以这个问题听起来太简单了。
我试过 运行 这个简单的程序,但是遇到了分段错误:
struct list {
int data;
struct list* next;
};
void makeList(struct list* list1) {
list1 = (struct list*) malloc(sizeof(struct list));
list1->next = NULL;
}
int main(int argc, char ** argv) {
struct list * list1;
makeList(list1);
list1->data = 5;
printf("data: %d\n", list1->data);
return 0;
}
我知道问题主要出在list1->data = 5
,但为什么呢?
在我看来,函数 makeList
获取结构列表的指针并为其分配存储空间。那就是我所做的,不是吗?我通过指针传递了 list1
。为什么它表现得像 list1 未初始化之类的?为什么不起作用?
在此声明中
struct list * list1;
声明了一个未初始化的指针,因此具有不确定的值。
在这个函数的调用中makeList
makeList(list1);
传递了指针值的副本list1
。所以这个函数改变了这个值的副本而不是原始指针。 main 中声明的原始指针保持不变。
您可以通过以下方式声明和定义函数,例如
struct list * makeList( void )
{
struct list *list = malloc( sizeof( struct list ) );
if ( list != NULL ) list->next = NULL;
return list;
}
而在 main 中,函数被调用为
list1 = makeList();
另一种方法是将main中声明的指针通过引用传递给函数。在 C 中,按引用传递意味着通过指向对象的指针间接传递对象。取消引用指针,您可以访问原始对象。
例如
void makeList( struct list **list )
{
*list = malloc( sizeof( struct list ) );
if ( *list != NULL ) ( *list )->next = NULL;
}
并且该函数被调用为
makeList( &list1 );