我正在尝试创建一个指针数组来保存各种大小的字符串。我想提示用户输入,将值存储在数组中,然后使用以下代码打印它们:
#include <stdio.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] = string;
}
for (int x = 0; x < 2; x++)
{
printf("%s\n", string_array[x]);
}
return 0;
}
我希望这段代码接受两个用户提示并存储每个字符串的地址。但是,当我运行代码时,最终用户提示表示存储在指针数组中每个地址的值。检查了一下,发现这是因为每个地址都是一样的。
我认为这是因为
string
变量每次都被实例化到相同的地址,或者尽管在每个 for 循环中都定义了,但从未更改过。阻止此代码工作的地址在这里发生了什么?
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] = string;
}
这个循环中的数组
string
具有块作用域。当块结束时它不复存在。所以 string_array[0]
和 string_array[1]
将指向不再存在的内存,并且访问该内存将调用未定义的行为。
对象有一个生命周期,超过它们就不能被访问。
在其生命周期之外引用一个对象没有定义 行为。
自动变量有对应执行的生命周期 他们的定义块。
修复:
正如@Weather Vane 评论的那样:
你正在存储同一个缓冲区的相同地址,但是当你 报告字符串,该缓冲区已超出范围。你可以做什么 是复制:
string_array[x] = strdup(string);
另一种解决方案是使用
malloc()
分配内存并使用标准 strcpy()
。如果输入超过块的原始长度,稍后可以使用 realloc()
调整内存大小。
我稍微修改了你的代码。使用
strcpy
将一个字符串传递给另一个。请注意,由于 char string[50]
.,50 是您可以读取的最大字符串大小
#include <stdio.h>
#include <string.h>
int main() {
char string_array[10][50];
char string[50];
for (int x = 0; x < 2; x++)
{
printf("Input Name of Fruit number %d\n", x);
fgets(string, 50, stdin);
strcpy(string_array[x], string);
}
for (int x = 0; x < 2; x++)
{
printf("%s\n", string_array[x]);
}
return 0;
}
为什么不将地址传递给指针数组来存储该唯一值?
问题不对
相同的唯一值地址(
string[]
)在string_array[x]
中成功存储了3次。
只是在第一个
for()
块的每次迭代之后,那个地址是无效的。