我正在开发一个C程序,它会生成一个双重链接的“记录”列表。
我的结构原型如下:
struct custRec(char[20] name, char[50] address, char[20] city,
char[2] stateAbbreviation, int zipCode, float balance);
struct linkedRec(custRec storedRec, custRec* nextRec, custRec* prevRec);
具体来说,对于我的custRec结构,使用char[20]
名称而不是char[]
名称是否有效?
“有效”,我的意思是 - 我试图将“name”字段限制为正好19个字符(+ null终止符)。我是否应该担心其他地方的长度并使结构接受任何长度的char数组?
答案 0 :(得分:2)
这种语法不正确(我最初误读了这个问题,因为它们看起来像函数声明,而不是结构定义):
struct custRec(char[20] name, char[50] address, char[20] city,
char[2] stateAbbreviation, int zipCode, float balance);
struct linkedRec(custRec storedRec, custRec* nextRec, custRec* prevRec);
你可能意味着:
typedef struct custRec
{
char name[20];
char address[50];
char city[20];
char stateAbbreviation[2];
int zipCode;
float balance;
} custRec; // Necessary because question is about C, not C++
typedef struct linkedRec
{
custRec storedRec;
custRec *nextRec;
custRec *prevRec;
} linkedRec;
我注意到在美国,州缩写是2个字符,因此您可能需要使用char state[3]
来允许终止null。
现在这在语法上是有效的。将数据复制到custRec
的字段时,需要注意确保复制不会溢出边界。编译器不强制执行长度。
因此,您需要检查函数内部传递给您的字符串是否超出您期望的限制。
如果您不想对长度施加限制,则可以将所有字符串结构成员制作成char *
,并且可以为任意长度的字符串动态分配内存。但对于美国的州缩写来说,这可能不是一个好主意;你确实希望强制执行'2个字符加'\0'
'限制。
答案 1 :(得分:0)
是的,如您所述,通常使用固定长度字符串声明结构。您需要非常小心地确保所有操作确保它们不超过长度,并且还要正确终止字段。否则你会得到各种奇怪的错误。
是的,您需要指定char[20]
而不是char[]
,因为您需要为数据预留空间。
但请注意,这确实对这些字段设置了任意上限,并且使得稍后扩展更加困难。考虑使用常规的char*
字段,并在堆上分配字符串,以便处理任何长度的字符串。这也需要一些内存管理(特别是清理!)。