为何指针数组存储的地址重复,无法保留多个输入字符串?
指针数组存储字符串地址异常的原因及修复
你的代码核心问题出在栈局部变量的内存复用机制上,具体拆解如下:
问题本质
你在for循环内部定义的char string[50]是栈上的自动局部变量,这类变量的内存分配和释放由编译器自动管理:
- 每次进入循环代码块时,编译器会在栈上为
string分配一块50字节的空间,但因为循环是重复执行同一代码块,每次迭代都会复用栈上的同一块内存地址——也就是说,两次循环里的string变量指向的是同一个内存位置。 - 你执行
string_array[x] = string;时,只是把这个固定的栈地址存入了指针数组,并没有复制字符串内容。第二次输入的内容会直接覆盖第一次存在该地址里的数据,最终指针数组的两个元素都指向同一块被最后一次输入覆盖的内存,所以打印时两次输出的都是最后一次输入的内容。
额外注意:当循环结束后,string的生命周期已经结束,此时指针数组里的指针属于悬空指针,访问它的行为是C标准定义的未定义行为——当前能输出内容只是因为栈内存还没被其他操作覆盖,实际开发中这种写法会导致不可预期的错误。
修复方案
方案1:使用堆内存存储字符串(灵活适配不同长度)
通过malloc为每个字符串单独分配堆内存,再复制输入内容,这样每个指针指向独立的内存空间:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *string_array[10]; for (int x = 0; x < 2; x++) { char string[50]; printf("Input Name of Fruit number %d\n", x); fgets(string, 50, stdin); // 分配足以容纳字符串+终止符的内存 string_array[x] = malloc(strlen(string) + 1); if (string_array[x] == NULL) { perror("malloc failed"); return 1; } strcpy(string_array[x], string); } for (int x = 0; x < 2; x++) { printf("%s\n", string_array[x]); // 记得释放堆内存,避免内存泄漏 free(string_array[x]); } return 0; }
方案2:使用二维字符数组(简单直接,适合固定最大长度场景)
直接定义二维数组,每个元素是固定大小的字符数组,避免指针管理问题:
#include <stdio.h> int main() { char string_array[10][50]; // 10个元素,每个最多存49个字符+终止符 for (int x = 0; x < 2; x++) { printf("Input Name of Fruit number %d\n", x); fgets(string_array[x], 50, stdin); } for (int x = 0; x < 2; x++) { printf("%s\n", string_array[x]); } return 0; }
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

