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 在数组中的最大预期字符数之上给出一个额外的字符,以便您或编译器可以将最终的字符串终止符放在末尾
除非你不想将它用作字符串
我正在尝试在头文件中声明一个结构。但它一直显示 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 在数组中的最大预期字符数之上给出一个额外的字符,以便您或编译器可以将最终的字符串终止符放在末尾
除非你不想将它用作字符串