C语言如何正确分配内存?共享内存循环段错误求助
解决共享内存中链表节点指针越界导致的段错误问题
嘿,我一眼就揪出问题所在了——你的指针偏移计算完全错了,这才导致循环到第8次就触发段错误。
问题根源
在C语言里,指针的算术运算都是基于它指向的类型大小自动调整的。比如你定义的node是struct Node*类型,那么node + 1会自动帮你偏移sizeof(struct Node)个字节,刚好指向内存里的下一个struct Node实例。
但你代码里写的是:
node->next = node + sizeof(struct Node);
这相当于让指针一次性偏移了sizeof(struct Node) * sizeof(struct Node)个字节!举个例子,如果struct Node的大小是20字节(int+10char+指针),那每次循环指针都会跳400字节,而你总共只分配了2000字节的共享内存,第8次循环时指针早就超出内存边界了,访问非法内存自然就触发段错误。
修正方案
把指针偏移的代码改成下面两种写法的任意一种都可以:
// 写法1:最直观的指针算术 node->next = node + 1; // 写法2:用数组下标语法,可读性更强 node->next = &node[1];
另外,别忘了给最后一个节点的next指针设为NULL,不然后续遍历链表时会继续访问非法内存。修改后的完整循环代码如下:
struct Node *head = node; // 保存头节点,方便后续操作 for(int i=0;i<100;i++){ node->ID = i; sprintf(node->password, "%s%i", "campo num:", i); // 最后一个节点的next置为NULL if (i == 99) { node->next = NULL; } else { node->next = node + 1; } printf("you are on %i cicle \n", i); node = node->next; }
关于内存大小的验证
你声明的共享内存大小sizeof(struct Node) * 100是完全正确的,刚好能容纳100个struct Node实例,所以内存分配的部分没有问题,不用怀疑这一点。
内容的提问来源于stack exchange,提问作者Casta
相关产品推荐
相关产品推荐

