struct文件中的strcpy/strncmp分段错误
我正在尝试使用char*字段(word)向结构添加一个新节点 列表的定义: 添加单词节点函数被main调用为:struct文件中的strcpy/strncmp分段错误,c,struct,char,strncpy,strncmp,C,Struct,Char,Strncpy,Strncmp,我正在尝试使用char*字段(word)向结构添加一个新节点 列表的定义: 添加单词节点函数被main调用为:add单词节点(read单词、list头部) 其中,read\u word由用户用scanf给出。字作为字符串传递,但在strncpy之后没有终止字节 >Debugger: add_word_node (word=0xbffff0fa "ally", head=0x804c038) at prog.c >Debugger: (gdb) p newn
add单词节点(read单词、list头部)
其中,read\u word
由用户用scanf给出。字作为字符串传递,但在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;
然后,当您分配内存时,您只需要将8个字节分配给newnode
,以便它可以容纳一个指针,然后您需要将内存分配给该指针,该指针将用于存储一些字符
虽然与您的问题无关,但我还想指出,您不应该强制转换
malloc()
的返回值。参见您确定当curr=head->next
时head->next不为空吗?因为在这种情况下,curr->word肯定会给出seg错误。。是的,这就是问题所在。我添加了一个if语句以在curr==NULL的情况下中断for循环,但仍然得到相同的seg错误。在for
循环中,我将检查curr
的有效性,而不仅仅是在else
中重新分配它:for(cur=head->next;curr->next;curr=curr->next)
会像你建议的那样有点安全,但我还是得到了seg<如果(curr==NULL)中断,则代码>用于(curr=head->next;curr->next!=NULL;curr=curr->next);如果(strncmp(curr->word,newnode->word,strlen(word))>0)中断代码>首先,在问题中发布相关信息,而不是在评论中。其次,我没有想到这个函数就是你的整个程序。我只是想礼貌地暗示你没有发布回答你问题所需的所有相关信息。您至少应该显示调用此函数的参数。这不是:newnode=(listT*)malloc(sizeof(listT)+WORDLEN)
allocate memory for char*word?@user3163175我看不出代码中的WORDLEN是什么,但不需要它,只需将内存分配给您的结构,并将内存分配给带有结构库的指针以获取信息。我更改了它,但我不认为这解决了问题,因为WORDLEN wach大于单词的实际长度。@user3163175请分配内存来保存WORDLEN
检查编辑我做了,但没有做任何更改
typedef struct {
char *word;
} listT;