你能从特定长度的数组中创建一个c结构吗?

时间:2010-12-02 22:15:27

标签: c struct

我正在开发一个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数组?

2 个答案:

答案 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*字段,并在堆上分配字符串,以便处理任何长度的字符串。这也需要一些内存管理(特别是清理!)。