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

C语言动态数组分配后所有索引仅返回最后一个元素问题求助

问题原因及修复方案

核心错误点

  • 所有字符串指针直接指向同一局部缓冲区
    你代码中所有presenters[i] = buffer;这类操作仅拷贝了缓冲区的内存地址,没有拷贝字符串内容。buffer是函数栈上的局部内存,每次fgets读取都会覆盖这块内存的内容,因此循环结束后所有数组元素指向的都是同一块内存,存储的自然是最后一次读取的文件内容。
  • 动态数组参数传值无法回传
    你函数传入的char**类型参数是值传递,函数内部对presenters = malloc(...)的赋值只会修改函数内的局部副本,调用方的对应指针根本接收不到你申请的内存地址,即便修复第一个问题,外部依然无法访问数据。
  • 数组长度计算逻辑错误
    sizeof presenters / sizeof *presenters的计算完全无效,presenters作为函数参数是指针类型,sizeof(presenters)拿到的是指针本身的字节大小,和数组实际长度没有任何关系。
  • 局部变量重定义冗余
    函数开头已经定义了char buffer[200],后面又重新定义了同名的char buffer[MAX_BUFFER_LENGTH],属于冗余的重定义,保留一个即可。

修复方案

  1. 复制字符串内容而非仅赋值地址:每次读取后使用strdup复制字符串,或手动申请内存后拷贝,其余7个数组的赋值逻辑都做同样修改:
// 替换原有的 presenters[i] = buffer; 写法
presenters[i] = strdup(buffer);
// 无strdup环境可替换为:
// presenters[i] = malloc(strlen(buffer) + 1);
// strcpy(presenters[i], buffer);
  1. 修正参数传递逻辑:如果需要在函数内申请数组并回传给调用方,需要将参数改为三级指针char***,传入调用方指针的地址:
// 函数声明修改为
int n(FILE **fp, int size, char ***presenters, char ***birth_numbers, ...其他参数同理)
// 内部malloc时改为
*presenters = malloc((size+1)* sizeof(char*));
// 赋值时改为
(*presenters)[i] = strdup(buffer);
  1. 移除无效的length_of_arrays相关判断,直接使用传入的size参数做校验即可。
  2. 可选优化:fgets会保留读取到的换行符,可手动去除末尾的\n避免后续处理出错:
buffer[strcspn(buffer, "\n")] = '\0';

内容的提问来源于stack exchange,提问作者Zaeema Anwar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:06:07