Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
struct文件中的strcpy/strncmp分段错误_C_Struct_Char_Strncpy_Strncmp - Fatal编程技术网

struct文件中的strcpy/strncmp分段错误

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

我正在尝试使用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 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;