C语言动态数组分配后所有索引仅返回最后一个元素问题求助
问题原因及修复方案
核心错误点
- 所有字符串指针直接指向同一局部缓冲区
你代码中所有presenters[i] = buffer;这类操作仅拷贝了缓冲区的内存地址,没有拷贝字符串内容。buffer是函数栈上的局部内存,每次fgets读取都会覆盖这块内存的内容,因此循环结束后所有数组元素指向的都是同一块内存,存储的自然是最后一次读取的文件内容。 - 动态数组参数传值无法回传
你函数传入的char**类型参数是值传递,函数内部对presenters = malloc(...)的赋值只会修改函数内的局部副本,调用方的对应指针根本接收不到你申请的内存地址,即便修复第一个问题,外部依然无法访问数据。 - 数组长度计算逻辑错误
sizeof presenters / sizeof *presenters的计算完全无效,presenters作为函数参数是指针类型,sizeof(presenters)拿到的是指针本身的字节大小,和数组实际长度没有任何关系。 - 局部变量重定义冗余
函数开头已经定义了char buffer[200],后面又重新定义了同名的char buffer[MAX_BUFFER_LENGTH],属于冗余的重定义,保留一个即可。
修复方案
- 复制字符串内容而非仅赋值地址:每次读取后使用
strdup复制字符串,或手动申请内存后拷贝,其余7个数组的赋值逻辑都做同样修改:
// 替换原有的 presenters[i] = buffer; 写法 presenters[i] = strdup(buffer); // 无strdup环境可替换为: // presenters[i] = malloc(strlen(buffer) + 1); // strcpy(presenters[i], buffer);
- 修正参数传递逻辑:如果需要在函数内申请数组并回传给调用方,需要将参数改为三级指针
char***,传入调用方指针的地址:
// 函数声明修改为 int n(FILE **fp, int size, char ***presenters, char ***birth_numbers, ...其他参数同理) // 内部malloc时改为 *presenters = malloc((size+1)* sizeof(char*)); // 赋值时改为 (*presenters)[i] = strdup(buffer);
- 移除无效的
length_of_arrays相关判断,直接使用传入的size参数做校验即可。 - 可选优化:
fgets会保留读取到的换行符,可手动去除末尾的\n避免后续处理出错:
buffer[strcspn(buffer, "\n")] = '\0';
内容的提问来源于stack exchange,提问作者Zaeema Anwar
相关产品推荐
相关产品推荐

