假设我有一个这样的结构
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中存储一些东西时,它存储在哪里?我明确地为这两个字符串分配内存吗?
答案 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?
是的,你必须为结构成员分配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;
答案 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