在包含字符串时为结构分配内存

时间:2013-10-09 05:19:41

标签: c memory struct

假设我有一个这样的结构

struct node{ // note that i have changed the struct code according to my convenience

    char* lastname;
    char* employeeID;

    struct node* nextRecord;
} ;
typedef struct node myRecord;

现在我正在为第一个节点分配内存,如下所示

headptr=malloc(sizeof(myRecord));

结构包含两个字符串。当我在headptr-> lastname中存储一些东西时,它存储在哪里?我明确地为这两个字符串分配内存吗?

3 个答案:

答案 0 :(得分:3)

when I store something in myRecord->lastname where does it get stored?

这将导致 undefined behaviour

should I allocate memory for those two strings explicitly?

是的,你必须为结构成员分配lastnameemployeeIDas

像这样:

headptr=malloc(sizeof(myRecord));

headptr->lastname = malloc(n1); // Alllocate n1 bytes
headptr->employeeIDas = malloc(n2); // Alllocate n2 bytes

但是,如果为这些指针指定字符串文字,则不需要分配内存。

headptr->lastname = "last name";
headptr->employeeIDas = "12345";

在这里,您正在指向指向具有静态存储持续时间的字符串文字。


无法在C中修改字符串文字(尝试修改调用未定义的行为)。如果您打算修改它们,那么您应该采用以前的方法(分配内存)并复制字符串文字。

headptr->lastname = malloc(n1); // Alllocate n1 bytes
headptr->employeeIDas = malloc(n2); // Alllocate n2 bytes

然后复制它们:

strncpy(headptr->lastname, "last name", n1);
headptr->lastname[ n1 - 1 ] = 0;
strncpy(headptr->employeeIDas, "12345", n2);
headptr->employeeIDas[ n2 - 1 ] = 0;

答案 1 :(得分:2)

是的,你需要为那些明确分配内存。您的结构不包含字符串,它包括仅指针,内存将作为结构内存分配的一部分进行分配。您自己决定使用这些指针作为字符串的头部,并且您需要为它们提供明确分配的空间,这与原始struct无关。

答案 2 :(得分:-1)

不,你没有必须为字符串分配内存。如果直接分配字符串,它将存储在只读部分(修改将不起作用)。如果你想要它可以修改,你将不得不分配内存。

headptr->lastname = "whatever"; // will work but no modify operations possible

headptr->lastname = malloc(NUM_BYTES);
headptr->lastname = "abc"; // modifiable string