C语言访问动态字符串数组时出现Segmentation Fault问题求助
问题原因分析
- 最常见原因:函数内部定义了同名局部变量遮蔽了全局变量
如果你在read_prop_file函数内又声明了一个同名的unsigned char **prop_cmd_parameters局部变量,那么你所有赋值操作都只会修改局部变量,全局的prop_cmd_parameters仍然是未初始化的野指针,函数外部访问全局变量时自然触发段错误。你可以尝试在read_prop_file函数结束前打印prop_cmd_parameters的地址值,再在外部访问前打印一次,两者不一致就能确认是该问题。 read_prop_file未被实际调用
如果你的代码逻辑中没有执行过read_prop_file,全局的prop_cmd_parameters没有被分配内存,保持初始野指针状态,访问就会触发段错误。- 数组越界访问
全局的prop_cmd_number值被其他代码意外修改,或者你外部访问时使用了大于等于prop_cmd_number的下标,访问超出了数组申请的边界,触发段错误。 - 内存分配失败未检查
你当前代码没有检查malloc的返回值,如果系统内存不足导致malloc返回NULL,访问NULL指针会直接触发段错误。建议增加如下检查逻辑,同时注意prop_cmd_parameters是unsigned char **类型,sizeof参数最好匹配类型更规范:prop_cmd_parameters = malloc(prop_cmd_number * sizeof(unsigned char *)); if (prop_cmd_parameters == NULL) { // 自定义错误处理逻辑 return; } for(i=0; i<prop_cmd_number; i++){ prop_cmd_parameters[i] = malloc(200 * sizeof(unsigned char)); if (prop_cmd_parameters[i] == NULL) { // 自定义错误处理逻辑 return; } // 后续文件读取逻辑 } - 其他潜在问题(可能间接破坏内存结构引发段错误)
- 循环变量
i未声明:你当前代码中的for(i=0; i<prop_cmd_number; i++)没有声明i变量,如果i不是全局变量,编译时会使用默认类型,值可能异常导致数组越界。 - 输入读取逻辑存在边界风险:你没有限制
tmp_len的最大值,若单行长超过200字节会触发堆内存溢出,破坏已分配的内存结构,后续访问任意堆内存都可能触发段错误。 - 文件指针有效性未检查:如果
prop_config文件打开失败,fscanf会读取失败导致prop_cmd_number值异常,后续malloc大小错误引发问题。
- 循环变量
内容的提问来源于stack exchange,提问作者nicosilverx
相关产品推荐
相关产品推荐

