2

假设我有这样的结构

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;

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

headptr=malloc(sizeof(myRecord));

该结构包含两个字符串。当我将某些内容存储在 headptr->lastname 中时,它会存储在哪里?我应该为这两个字符串显式分配内存吗?

4

3 回答 3

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

它将导致未定义的行为

should I allocate memory for those two strings explicitly?

lastname是的,您也必须为结构成员分配employeeIDas

像这样:

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;
于 2013-10-09T05:24:35.290 回答
2

是的,您需要为这些显式分配内存。您的结构不包含字符串,它仅包含将为其分配内存的指针,作为结构内存分配的一部分。将这些指针用作字符串的头部是您自己的决定,并且您需要为它们提供显式分配的空间,这与原始struct.

于 2013-10-09T05:24:20.553 回答
-1

不,您不必字符串分配内存。如果您直接分配一个字符串,它将存储在一个只读部分(修改将不起作用)。如果您希望它可修改,则必须分配内存。

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

或者

headptr->lastname = malloc(NUM_BYTES);
headptr->lastname = "abc"; // modifiable string
于 2013-10-09T06:05:03.723 回答