使用malloc创建双指针临时字符串数组时出现覆盖问题求助
问题分析与修复:字符串被覆盖的原因
你的代码核心问题是所有指针都指向了同一块栈内存:
- 你声明的
buffer[10]是栈上的固定数组,每次调用fgets都会把新输入的内容写入这块内存,覆盖之前的数据。 *(input+i) = buffer;这行代码只是把buffer的地址赋值给input数组的每个元素,并没有复制字符串内容。所以最后input里的5个指针全指向同一个buffer,自然输出的都是最后一次输入的内容。
修复方案1:为每个字符串单独分配堆内存并复制内容
利用strdup(或者手动malloc+strcpy)为每个输入的字符串分配独立的内存空间,确保每个指针指向不同的内存块:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char const *argv[]) { char** input = malloc(5 * sizeof(char*)); char buffer[10]; for (int i = 0; i < 5; i++) { fgets(buffer, 10, stdin); // strdup自动分配内存并复制字符串 input[i] = strdup(buffer); // 如果编译器不支持strdup,用下面两行替代: // input[i] = malloc(strlen(buffer) + 1); // strcpy(input[i], buffer); printf("%s", input[i]); } for (int i = 0; i < 5; i++) { printf("%s", input[i]); free(input[i]); // 逐个释放字符串内存 } free(input); // 释放指针数组本身 printf("\n"); return 0; }
修复方案2:直接为每个指针分配独立的输入缓冲区
跳过中间的buffer,直接给input的每个元素分配内存,让fgets直接写入堆内存:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char const *argv[]) { char** input = malloc(5 * sizeof(char*)); for (int i = 0; i < 5; i++) { input[i] = malloc(10 * sizeof(char)); // 每个元素分配10字节缓冲区 fgets(input[i], 10, stdin); printf("%s", input[i]); } for (int i = 0; i < 5; i++) { printf("%s", input[i]); free(input[i]); } free(input); printf("\n"); return 0; }
额外提醒
- 使用堆内存后,必须对应调用
free释放,否则会造成内存泄漏。 fgets会把输入的换行符也读入字符串,如果不需要换行符,可以用buffer[strcspn(buffer, "\n")] = '\0';手动截断。
内容的提问来源于stack exchange,提问作者João Victor Velasco
相关产品推荐
相关产品推荐

