【问题标题】:How do you correctly initialize an array of structs in C? [duplicate]如何正确初始化 C 中的结构数组? [复制]
【发布时间】:2021-02-17 03:06:51
【问题描述】:

如果我在这里运行这个程序。

#include <stdio.h>
#define SIZE 3

struct member
{
  char firstname[30];
  char lastname[30];
  char phone[10];
  int age;
};

int main()
{
  struct member members[] = {
      {
          "Martha",
          "Flores",
          "5576380918",
          20
      },
      {
          "Carolina",
          "Fuentes",
          "5510101010",
          21
      },
      {
          "Fernanda",
          "Ramos",
          "7778189054",
          23
      }};

  for (int i = 0; i < SIZE; i++)
  {
    printf("%s %s %s %d\n", members[i].firstname, members[i].lastname, members[i].phone, members[i].age);
  }

  return 0;
}

输出将是预期的+第二个结果的奇怪字符:

Martha Flores 5576380918 20
Carolina Fuentes 5510101010� 21
Fernanda Ramos 7778189054 23

现在,如果我从结构中删除字段 age 并相应地重写程序以获得相同的行为。

#include <stdio.h>
#define SIZE 3

struct member
{
  char firstname[30];
  char lastname[30];
  char phone[10];
  // int age;
};

int main()
{
  struct member members[] = {
      {
          "Martha",
          "Flores",
          "5576380918",
          // 20
      },
      {
          "Carolina",
          "Fuentes",
          "5510101010",
          // 21
      },
      {
          "Fernanda",
          "Ramos",
          "7778189054",
          // 23
      }};

  for (int i = 0; i < SIZE; i++)
  {
    printf("%s %s %s\n", members[i].firstname, members[i].lastname, members[i].phone);
    // printf("%s %s %s %d\n", members[i].firstname, members[i].lastname, members[i].phone, members[i].age);
  }

  return 0;
}

我得到了这个输出:

Martha Flores 5576380918Carolina
Carolina Fuentes 5510101010Fernanda
Fernanda Ramos 7778189054���

显然我在初始化数组时做错了,我尝试更具体地使用 {.firstname = "", .lastname="", ...} 初始化数组上的元素,但得到了相同的结果。

我正在用 GCC 编译它

【问题讨论】:

  • 始终注意“Too Short By One” 问题。最好是 1000 个字符太长,而不是 1 个字符太短......

标签: c


【解决方案1】:

您的电话号码实际上有 11 个字符长,因为它们包含 NUL 终止字符 ('\0')。您需要提供适当的空间。

例如,这两个字符串是等价的。

char n[] = "5576380918";
char m[] = { '5', '5', '7', '6', '3', '8', '0', '9', '1', '8', '\0' };

只需为您的电话号码提供更多空间:

struct member {
    char firstname[30];
    char lastname[30];
    char phone[11];
    int age;
};

您看到的随机字符是读取分配空间末尾后未定义行为的不确定结果,因为 printf 函数依赖于正确 NUL 终止的字符串。

【讨论】:

  • 没错,我完全忘记了NULL字符。看到它会影响这样的事情很奇怪,但这是有道理的。
猜你喜欢
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 2011-03-11
  • 2011-08-20
  • 2012-01-22
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多