You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用malloc时因空指针引发Segmentation Fault(SIGSEGV)的问题求助

修复add_lines函数的段错误问题

嘿,你的段错误根源完全是运算符优先级搞混了!我们一步步来拆解:

问题所在

在你的循环里,你写了:

*lines[i] = (char*)malloc(64*sizeof(char));

这里的坑是:数组下标运算符[]的优先级比解引用运算符*高,所以这句代码实际等价于*(lines[i])——而lines是一个char***类型的指针(也就是指向char**的指针),lines[i]会试图访问传入指针的第i个偏移位置,这显然是非法的(因为你传入的只是单个指针,不是指针数组),自然会触发段错误。

修复后的代码

你需要先解引用lines拿到我们刚malloc出来的char**数组,再去访问它的第i个元素,也就是给*lines加上括号:

void add_lines(char*** lines, int line_count) {
    // 先分配存储指针的数组
    *lines = (char**)malloc(line_count * sizeof(char*));
    if (*lines == NULL) { // 别忘了检查malloc是否成功!
        perror("malloc failed for lines array");
        return;
    }
    for (int i = 0; i < line_count; i++) {
        // 正确的写法:先解引用lines得到数组,再取第i个元素
        (*lines)[i] = (char*)malloc(64 * sizeof(char));
        if ((*lines)[i] == NULL) { // 同样检查每个字符串的malloc
            perror("malloc failed for individual line");
            // 中途分配失败时,释放已分配的内存避免泄漏
            for (int j = 0; j < i; j++) {
                free((*lines)[j]);
            }
            free(*lines);
            *lines = NULL;
            return;
        }
        // 示例:给每个字符串赋值(你可以换成自己需要的内容)
        snprintf((*lines)[i], 64, "This is line %d", i+1);
    }
}

为什么这样就对了

(*lines)会先解引用传入的char***参数,得到我们刚分配好的char**类型的数组指针,然后(*lines)[i]就是这个数组里的第i个char*元素,此时给它分配内存就完全合法了。

另外额外提一句:记得要检查malloc的返回值,避免因为内存分配失败导致后续的非法访问;如果中途分配失败,还要把已经分配的内存释放掉,防止内存泄漏。

内容的提问来源于stack exchange,提问作者dmolz

火山引擎 最新活动