两种struct LinkedList指针声明的区别及使用疑问
两种链表指针声明的区别分析
先明确链表结构体定义:
struct LinkedList{ int data; struct LinkedList *next; };
两者核心差异
声明1:
struct LinkedList *current = malloc(sizeof(struct LinkedList));
这行代码干了两件事:一是声明了一个指向struct LinkedList的指针current,二是立刻通过malloc给它分配了一块大小刚好匹配链表结构体的合法内存块。此时current指向的是一个完整可用的链表节点实例,你可以直接读写它的data和next成员,不会出问题。声明2:
struct LinkedList *current;
这行只做了一件事:声明了一个指针变量current,但完全没给它指定指向的内存——它的初始值是随机的(也就是常说的「野指针」)。如果直接去操作current->data或者current->next,本质是访问非法内存,必然导致程序崩溃、行为异常,这就是你用这种声明创建链表时达不到预期的原因。
链表创建里的正确使用姿势
如果用声明2的写法,必须补充分配内存的步骤,比如:
struct LinkedList *current; // 先给指针分配合法内存,否则不能操作成员 current = malloc(sizeof(struct LinkedList)); // 记得判断内存分配是否成功,避免空指针问题 if (current == NULL) { // 这里可以加内存分配失败的处理逻辑,比如报错退出 return; } current->data = 5; current->next = NULL;
内容的提问来源于stack exchange,提问作者Data Scientist to be
相关产品推荐
相关产品推荐

