[英]strcpy / strncmp segmentation fault in struct fileds
我正在尝试将新节点添加到具有char *字段(单词)的结构中
listT的定义:
enum boolean {false, true};
struct list {
enum boolean sorted;
union{
int words;
char *word;
};
struct list* next;
struct list* previous;
};
typedef struct list listT;
main调用add_word_node函数的方式为: add_word_node(read_word, list_head)
其中read_word
由用户使用scanf给出。 Word作为字符串传递,但是在strncpy之后没有终止字节。
>Debugger:
add_word_node (word=0xbffff0fa "ally", head=0x804c038) at prog.c
>Debugger:
(gdb) p newnode->word
$2 = 0x804c068 "allyP\224\373\267\377\377\377\377"
listT *add_word_node(char word[], listT *head) {
listT *newnode;
listT *curr = NULL;//sorted
//listT *prev;//sorted
newnode = malloc(sizeof(listT)); /* allocate new node and check */
newnode->word = malloc(sizeof(char)* WORDLEN);
strncpy(newnode->word, word, strlen(word));
//newnode->word = strndup(word, strlen(word));
if (newnode == NULL) {
return (NULL);
}
if (head->sorted == false){ //eisagwgh sto telos ths listas
newnode->next = head;
head->previous->next = newnode;
newnode->previous = head->previous;
head->previous = newnode;
}else {
if(head->next == head){
newnode->next = head;
newnode->previous = head;
head->next = newnode;
head->previous = newnode;
}else{
for (curr = head->next; curr->next != NULL; curr = curr->next){//for( curr = head->next; ;){
if(curr == NULL) break;
if(strncmp(curr->word,newnode->word,strlen(word)) > 0) break;
//else curr= curr->next;
}
if(strncmp(curr->word,newnode->word,strlen(word))== 0){
return(curr);
}
newnode->next = curr;
newnode->previous = curr->previous;
newnode->previous->next = newnode;
newnode->next->previous = newnode;
}
}
return (newnode);
}
我已经阅读了有关此问题的其他主题,并且将函数更改为使用word []代替char *,但仍然无法正常工作。 请告诉我是否需要更多信息。 另外,当我使用strndup时,有时可以正常工作而没有任何错误。
正如您所说的,您有一个char *word
那么应该为该指针分配内存
newnode->word = malloc(sizeof(char) * (WORDLEN+1)); /* Please access the structure elements accordingly */
在向指针写入内容之前,应将内存分配给该指针。
扩展@Gopi的答案:
您的声明
newnode = (listT *) malloc(sizeof(listT) + WORDLEN);
将内存分配给指针newnode
。 这意味着,例如,如果WORDLEN
与sizeof(listT)
相同,则将为newnode
两个listT
元素分配内存。 类似于char *ptr = malloc(2);
这将为ptr
两个char
元素分配内存。
TL; DR:此WORDLEN
内存不会分配给newnode->word
,而是分配给newnode
。 要解决您的问题,必须将内存分别分配给newnode->word
。 newnode
不需要该内存,但是newnode->word
则需要。
strndup()
之所以有效,是因为它为您分配了内存。
如果您仍然难以理解这一点,那么您可能会对指针有一些误解。
newnode->word
是一个指针。 它在特定计算机上具有固定大小(例如8字节)。 为了简单起见,假设listT
定义如下:
typedef struct {
char *word;
} listT;
然后,当您分配内存时,只需要向newnode
分配8个字节,以便它可以容纳一个指针,然后就需要为该指针分配内存,该指针将用于存储一些字符。
malloc()
的返回值。
请参见是否强制转换malloc的结果?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.