c - 循环内的结构数组

标签 c arrays loops struct

我正在学习 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;
}

Live example

最后一点,您应该避免使用 fgets (see here) .喜欢getline反而。

关于c - 循环内的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39281203/

相关文章:

并发流中的 CUDA cuFFT API 行为

c++ - 访问数组 C++ 最后地址的最安全方法

c++ - 是否可以在数组中保存具有不同参数的成员函数?

r - (R) 数据帧的 for 循环不起作用

php - 循环遍历记录集(PHP + MySQL),将列表项中的每 2 条记录分组

python - 如何使用Python将csv行循环到selenium元素?

c - 我需要 for 循环的解释

c - 无法将 header 设置为指向链表中的新节点

c - 给定一个矩阵和一些规则,设置二进制矩阵的所有位所需的最少天数是多少

c++ - 1 索引数组上的 qsort() 搞乱了索引