C语言传递动态数组指针至函数后出现段错误且params仍为NULL
问题分析
Exit code 139对应SIGSEGV段错误,本质是程序访问了非法内存(比如解引用NULL指针)。你遇到的核心问题是:parser函数内对params的修改没有同步到函数外部——哪怕用了三级指针,大概率是函数内的操作没正确作用到外部的指针变量上,导致外部params始终为NULL,最终触发段错误。
常见错误示例与修正
假设你的代码存在以下典型问题:
错误示例1:用二级指针但未传递指针地址
void parser(char** params) { // 错误:仅修改了函数内的局部指针副本,和外部变量无关 params = malloc(10 * sizeof(char*)); params[0] = strdup("test"); } int main() { char** params = NULL; parser(params); // 传递的是params的值,而非地址 printf("%s", params[0]); // params仍为NULL,触发段错误 return 0; }
错误示例2:用三级指针但操作层级错误
void parser(char*** params) { // 错误:未解引用到最外层指针,修改的还是局部三级指针副本 params = malloc(10 * sizeof(char**)); (*params)[0] = strdup("test"); } int main() { char** params = NULL; parser(¶ms); printf("%s", params[0]); // 外部params依旧为NULL return 0; }
正确的三级指针用法
要修改外部的char**变量,需传递它的地址(即char***),并在函数内通过两次解引用操作外部指针:
#include <stdio.h> #include <stdlib.h> #include <string.h> void parser(char*** params) { // 给外部的char**分配内存 *params = malloc(10 * sizeof(char*)); if (*params == NULL) { perror("malloc failed"); return; } // 给指针数组的元素分配内容 (*params)[0] = strdup("hello"); (*params)[1] = strdup("world"); (*params)[2] = NULL; // 用NULL标记参数结束 } int main() { char** params = NULL; parser(¶ms); // 传递params的地址 // 验证并释放内存 if (params != NULL) { for (int i = 0; params[i] != NULL; i++) { printf("%s ", params[i]); free(params[i]); // 释放单个字符串 } free(params); // 释放指针数组 } return 0; }
关键注意事项
- 修改指针变量必须传递它的地址:要改
char**类型的变量,就得传char***,通过*params操作外部的char**变量。 - 必须检查动态分配的返回值:
malloc/strdup可能分配失败,返回NULL,不检查会引发新的错误。 - 用完动态内存必须释放:避免内存泄漏,先释放指针数组的每个元素,再释放数组本身。
内容的提问来源于stack exchange,提问作者Xhar
相关产品推荐
相关产品推荐

