C: 太多的初始化值

C: too many initializer values

我正在尝试在头文件中声明一个结构。但它一直显示 main.c 文件中的初始值设定项过多。我试过使用指针但没有这样做,但它仍然表明我错了。

这是主要文件:

#define MAX_PETS 7
struct Patient pets[MAX_PETS] = { 
    {1024, "Shaggy Yanson", {"CELL","3048005191"} }, //too many initializer values for phone no.
    {1032, "Puglsey Yanson", {"CELL","3048005191"} },
    {1040, "Beans Maulin", {"HOME","3649155831"} },
    {1048, "Banjo Codi", {"TBA",{'[=10=]'}} },
    {1056, "Rover Davidov", {"WORK","7934346809"} }
};

头文件:

struct Phone
{
    char description[4];
    char phoneNumber[10];
};
struct Patient
{
int no[4];
char name[15];
struct Phone phn;
};

提前致谢。

我做了一些小修复并解决了一些问题

#include <stdlib.h>
#include <stdio.h>
#define MAX_PETS 7
struct Phone
{
    char description[5];
    char phoneNumber[11];
};
struct Patient
{
int no;
char name[15];
struct Phone phn;
};

struct Patient pets[MAX_PETS] = { 
    {1024, "Shaggy Yanson", {"CELL","3048005191"} }, //too many initializer values for phone no.
    {1032, "Puglsey Yanson", {"CELL","3048005191"} },
    {1040, "Beans Maulin", {"HOME","3649155831"} },
    {1048, "Banjo Codi", {"TBA",{'[=10=]'}} },
    {1056, "Rover Davidov", {"WORK","7934346809"} }
};

int main(int argc, char **argv){
    
    pets; 
    printf("%s", pets->name); //this shouldn't be done in a professional context as it can confuse but results in printing the first name in the pets array
    return 0;
}

代码不是的原因运行

正如评论所指出的,int no 应该是一个常规的 int,因为它意味着一个数字(例如 1024)而不是 4 个有符号整数的集合({1024,-1023, 1032, 288763})


因此,我认为您对指针、数组和字符数组感到困惑,所以这里有一个很好的解释,我希望能解释一下


数组

数组是您定义的某种数据类型(字符、短整型、整数、结构等...)的 list/collection,如果您执行 int varName[4],您将存储 4整数背靠背,内存中没有间隙。 尽管 varName 不是指针,但实际上您可以轻松地将其“转换”为指针,只需弄乱 varName 而无需指定数组中的位置(基本上 varName 将 return 指向 varName[0] 的指针,而 varName+ 1 return 是一个指向位置 1 的指针,依此类推)当你了解更多 C 或汇编的内部和外部时,你会意识到为什么这是但它超出了问题的范围

指针

指针只是一个变量,它存储另一个变量的虚拟地址。基本上当你 return 值时它会告诉你它指向的值在哪里

字符

一个 char 只是一个字节(所以它从 127 到 -128)长整数(而 int 通常 有 4 个字节来表示它),它的主要用途是代表字符,例如 \0 将是一个字符串终止符,这将导致 char 分配给它的数字 0 但是如果你告诉它保留 65 作为一个值并将它打印为一个字符,它会说它是一个 A这仅取决于您希望如何表示变量

字符数组和字符串

一个字符数组是一串背对背的字符,通常用于表示一串文本以及compiler/computer知道结尾的方式它末尾的字符串终止符这是一个 \0 或一个值为 0 的 char,这就是为什么在将 space 分配给 char 数组或应该用作字符串的指针时必须小心的原因你必须允许额外的 space 作为终止符

你不必总是终止字符串,因为编译器会根据上下文为你做这件事,例如当我打印 pets->name 时,它​​正确地停止在它应该的位置的原因是因为编译器在“Shaggy Yanson”的末尾添加了一个终止符

但是编译器理解上下文的能力非常有限,所以当你说描述是一个有 4 个位置的数组并将它们填充到末尾时(假设 phoneNumber 数组现在是 null因此终止字符串的维度为 11),因为数组是背靠背存储的:

printf("%s", pets[0].phn.description); // prints the description of the phone inside the first pet

将导致 CELL3048005191 这不是我们想要的,因为第一个终止符在 phone 上所以 always 在数组中的最大预期字符数之上给出一个额外的字符,以便您或编译器可以将最终的字符串终止符放在末尾 除非你不想将它用作字符串