You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:15:04