使用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




