2010-12-02 68 views
0

我正在生成一个C程序,该程序生成“记录”的双向链接列表。你可以从一个特定长度的数组中创建一个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[]名字?通过“有效”,我的意思是 - 我试图限制“名称”字段正好19个字符(+空终止符)。我应该担心其他地方的长度,并让结构接受任何长度的char数组?

+0

这两个选项之间的差异是非常微不足道的。 – Falmarri 2010-12-02 22:19:12

回答

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]来允许终止空。

这现在在语法上是有效的。当您将数据复制到custRec的字段中时,您需要小心以确保您的复制不会溢出边界。编译器不执行长度。

因此,您需要检查函数内部传递给您的字符串是否超出您所期望的范围。

如果您不希望对长度施加限制,则可以将所有字符串结构成员设置为char *,并且可以为任意长度的字符串动态分配内存。但这对美国的州名缩写可能不是一个好主意;那么你确实想要执行'2个字符加上'\0''的限制。

+0

谢谢。你对州的缩写也是正确的。 – 2010-12-02 22:47:21

0

是的,按照您所描述的方式声明具有固定长度字符串的结构是很常见的。您需要非常小心,以确保所有操作都能确保它们不超过长度,并且还能正确终止域。否则,你会得到各种奇怪的错误。

是的,您需要指定char[20]而不是char[],因为您需要为数据预留空间。

但是,请注意,这确实会在这些字段上设置一个任意的上限,并且使得稍后扩展更加困难。考虑定期使用char*字段,并在堆上分配字符串,以便处理任何长度的字符串。这也需要一些谨慎的内存管理(特别是清理!)。

相关问题