我正在学习 C 并且正在研究结构,但我发现了一些我无法解释的行为,我想知道为什么会发生这种情况。
这是我的代码:
struct my_struct{
char *name;
};
int main()
{
struct my_struct arr[3];
int i = 0;
char str[10];
while (i<3)
{
fgets(str, 10, stdin);
arr[i].name = str;
printf("Array number %d: %s", i, arr[i].name);
i++;
}
printf("1 - %s\n2 - %s\n3 - %s", arr[0].name, arr[1].name, arr[2].name);
return 0;
}
我的输入:
test1
test2
test3
预期输出:
Array number 0: test1
Array number 1: test2
Array number 2: test3
1 - test1
2 - test2
3 - test3
结果输出:
Array number 0: test1
Array number 1: test2
Array number 2: test3
1 - test3
2 - test3
3 - test3
结果输出:
问题是,只要while循环一直在运行,似乎就没问题;然而,当它退出时,它似乎将数组中结构的每个“名称”值都设置为最后一个。
如果,一旦跳出循环并在最后一个 printf() 之前,我手动设置数组中最后一个结构的名称,这是唯一更新的结构,但之前的结构名称仍设置为最后一个进入循环。
我想我遗漏了一些关于内存管理的东西,比如在再次调用 fgets() 之前刷新缓冲区或......,但无法弄清楚发生了什么。有谁知道这是怎么回事吗?
最佳答案
这就是你所期望的,这样想,你有char str[10]
,这就是存储你的字符串的内存。当您使用 arr[i].name = str
设置每个数组名称时,您将 char * name
指向此内存。所以这是你的 for 循环正在做的事情:
0. str = []; arr[0].name = NULL; arr[1].name = NULL; arr[1].name = NULL;
1. str = [string1]; arr[0].name = str; arr[1].name = NULL; arr[1].name = NULL;
2. str = [string2]; arr[0].name = str; arr[1].name = str; arr[1].name = NULL;
3. str = [string3]; arr[0].name = str; arr[1].name = str; arr[1].name = str;
所以在循环结束时,所有 arr.name
指针都指向字符串,并且您每次都编辑了字符串。如果您希望各个 arr
元素存储它们自己的字符串,那么您最好这样做:
struct my_struct{
char name[10]; // Note how each instance of `my_struct` now stores its own string.
};
int main() {
struct my_struct arr[3];
int i = 0;
while (i<3) {
fgets(arr[i].name, 10, stdin);
printf("Array number %d: %s", i, arr[i].name);
i++;
}
printf("1 - %s\n2 - %s\n3 - %s", arr[0].name, arr[1].name, arr[2].name);
return 0;
}
最后一点,您应该避免使用 fgets
(see here) .喜欢getline
反而。
关于c - 循环内的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39281203/