如何在C中正确初始化结构数组?

如何在C中正确初始化结构数组?,c,C,如果我在这里运行这个程序 #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&

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

#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;
}
现在,如果我从结构中删除字段年龄并相应地重写程序以获得相同的行为

#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;
}
显然,我在初始化数组时做了一些错误的事情,我尝试在使用{.firstname=“”,.lastname=“”,…}初始化数组上的元素时更加具体,但得到了相同的结果


我是用GCC编译的,您的电话号码实际上是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结尾,因此您看到的随机字符是读取超过分配空间末尾的未定义行为的不确定结果。

没错,我完全忘记了空字符。奇怪的是,它会影响像这样的事情,但这是有道理的。始终要注意“一个太短”的问题。最好是长1000个字符,而不是短1个字符。。。
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;
};