C语言传递数组指针到被调函数写入字符串触发段错误如何解决
错误原因
- 运算符优先级错误:C语言中
[]下标运算符优先级高于*解引用运算符,你在func中写的*c[1]会被优先解析为*(c[1]),而c是你传入的&arr,只有c[0]是合法的地址,访问c[1]属于越界读取非法内存,解引用后触发段错误。正确写法是加括号改变运算顺序:(*c)[1],先解引用c拿到原arr指针,再取下标访问对应的数组元素。 - 数组指针类型不匹配:你在main中定义的
char (*arr)[2]是「指向长度为2的char数组的指针」,但你分配的是char[2][10](2个长度为10的char数组),指针步长计算完全错误,就算优先级问题修复,访问arr[1]也只会偏移2字节而不是正确的10字节,无法拿到第二个数组的地址。需要将arr的声明改为char (*arr)[10],对应func的参数类型改为char (**c)[10]。
修复后可正常运行的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> void func(char (**c)[10]) { // 加括号修正优先级 memcpy((*c)[0], "hello", sizeof("hel")); memcpy((*c)[1], "hi", sizeof("hi")); } int main() { // 修正数组指针的元素长度为10,和分配的内存匹配 char (*arr)[10] = malloc(sizeof(char[2][10])); func(&arr); printf("%s\n", arr[0]); printf("%s\n", arr[1]); // 补充内存释放避免泄漏 free(arr); return 0; }
运行输出
hell hi
可选简化方案
如果你不需要在func内部修改arr本身的指向(比如不需要对arr执行realloc等操作修改其指向的内存地址),完全不需要传递二级指针,直接传入arr即可,代码更简洁不易出错:
#include <stdio.h> #include <stdlib.h> #include <string.h> void func(char (*c)[10]) { memcpy(c[0], "hello", sizeof("hel")); memcpy(c[1], "hi", sizeof("hi")); } int main() { char (*arr)[10] = malloc(sizeof(char[2][10])); func(arr); printf("%s\n", arr[0]); printf("%s\n", arr[1]); free(arr); return 0; }
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

