You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:58:40