2013-10-09 15 views
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)); 

的结构inludes 2分配存储器的结构一个结构分配内存字符串。当我在headptr-> lastname中存储某些内容时,它将被存储在哪里?我明确地为这两个字符串分配内存吗?

回答

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

我不相信 '无处' 在这里正确的单词(UB依然屹立,肯定)。而且,如果NUM_BYTES是不变的,它应该在数组结构内(与问题没有直接关系,而是改进)。 – keltar

+0

刚刚用变量'n1'和'n2'代替它,如果这样做更好。 –

+0

“*但是,如果将字符串文字分配给这些指针,则不需要分配内存*” - 并且一旦尝试修改就会得到UB。 – SomeWittyUsername

2

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

-1

不,你不为字符串分配内存。如果直接分配一个字符串,它将存储在只读部分(修改将不起作用)。如果你想修改它,你将不得不分配内存。

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

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

完全错误,这将导致内存泄漏,修改仍然会调用UB。 – SomeWittyUsername

相关问题