简体   繁体   English

分段错误和Valgrind没有在C中的Trie树上堆叠地址错误

[英]Segmentation fault and Valgrind not stacked address errors on a Trie Tree in C

I'm writing a Trie Tree in C, with these structs: 我正在用C语言写一个Trie Tree,结构如下:

typedef struct sNode Node;
struct sNode {
    int word;
    unsigned int nsons;
    Node *next[26];
};

typedef struct {
     Node *root;
} Trie;

But I'm having a problem in this insert function: 但是我在这个插入函数中遇到了问题:

int insert(Trie* trie, char word[]){
    int i=0, posiletter, contletters=0;
    char letter=word[0];
    Node *newroot;
    Node *newNode=NULL;
    Node **copyroot;
    Node *current=NULL;
    Node *Nodefather=NULL;
    Node verif;


    if (trie->root=NULL){
        newroot=malloc(sizeof(Node));   
        for (i=0; i<=25; i++) newroot->next[i]=NULL;
        newroot->nsons=0;
        newroot->word=0;
        trie->root=newroot;
    }
    copyroot=&trie->root;
    current=*copyroot;
    while (word[contletters]!='\0'){
        posiletter=(word[contletters])-'a';

        while( (current->next[posiletter])!= NULL ){ // Error in this line
            Nodefather=current;
            current=current->next[posiletter];
        }
        if ( (current->next[letter-'a']) == NULL ){
            newNode=malloc(sizeof(Node));
            //newNode=malloc(sizeof(Node));   
            for (i=0; i<=25; i++) newNode->next[i]=NULL;
            newNode->nsons=0;
            newNode->word=0;
            Nodefather->next[letter-'a']=newNode;
            Nodefather->nsons=(Nodefather->nsons)+1;

        }
        contletters++;

    }
    if  (letter=='\0') Nodefather->next[letter-'a']->word=1; //end of word
    return 1;
}

The function receives a pointer to the tree and an string. 该函数接收指向树和字符串的指针。 If the root of the Trie is NULL, it creates a node, after this, it searchs on the array next a free (NULL) position to store. 如果Trie的根是NULL,它会创建一个节点,在此之后,它会在数组上搜索要存储的空闲(NULL)位置。

The problem is in this line: 问题出在这一行:

while( (current->next[posiletter])!= NULL ){ // Error in this line

It gives me Segmentation fault error when I execute this, and this error on GDB: 它在我执行此操作时给出了Segmentation fault错误,并且在GDB上出现此错误:

Program received signal SIGSEGV, Segmentation fault.
0x0804883f in insert (trie=0x804b008, word=0xbffff230 "abcdef") at trie.c:97
97          while( (current->next[posiletter])!= NULL ){ // Error in this line

And using Valgrind this way: valgrind --tool=memcheck --leak-check=full --track-origins=yes ./trie It give me these errors 并以这种方式使用Valgrind:valgrind --tool = memcheck --leak-check = full --track-originins = yes ./trie它给了我这些错误

==3409== Invalid read of size 4
==3409==    at 0x804883F: insert (trie.c:97)
==3409==    by 0x80485FD: main (triet.c:36)
==3409==  Address 0x8 is not stack'd, malloc'd or (recently) free'd
==3409== 
==3409== 
==3409== Process terminating with default action of signal 11 (SIGSEGV)
==3409==  Access not within mapped region at address 0x8
==3409==    at 0x804883F: insert (trie.c:97)
==3409==    by 0x80485FD: main (triet.c:36)
==3409==  If you believe this happened as a result of a stack
==3409==  overflow in your program's main thread (unlikely but
==3409==  possible), you can try to increase the size of the
==3409==  main thread stack using the --main-stacksize= flag.
==3409==  The main thread stack size used in this run was 8388608.
==3409== HEAP SUMMARY:
==3409==     in use at exit: 4 bytes in 1 blocks
==3409==   total heap usage: 1 allocs, 0 frees, 4 bytes allocated
==3409== 
==3409== LEAK SUMMARY:
==3409==    definitely lost: 0 bytes in 0 blocks
==3409==    indirectly lost: 0 bytes in 0 blocks
==3409==      possibly lost: 0 bytes in 0 blocks
==3409==    still reachable: 4 bytes in 1 blocks
==3409==         suppressed: 0 bytes in 0 blocks
==3409== Reachable blocks (those to which a pointer was found) are not shown.
==3409== To see them, rerun with: --leak-check=full --show-reachable=yes
==3409== 
==3409== For counts of detected and suppressed errors, rerun with: -v
==3409== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 6)
Segmentation fault

I really appreciate any help. 我非常感谢任何帮助。 Thanks! 谢谢!

====Edit==== Values in the time of the crash: ====编辑====崩溃时的值:

(gdb) print current
$1 = (Node *) 0x0
(gdb) print current->next
Isn't possible acess the memory at the address 0x8
(gdb) print current->next[posiletter]
Isn't possible acess the memory at the address 0x8
(gdb) print posiletter
$2 = 0

===Edit2=== Other values requesteds: === Edit2 ===要求的其他值:

(gdb) print contletters
$3 = 0
(gdb) print trie->root
$4 = (Node *) 0x0
(gdb) print trie->root->next[word[0]-'a']
Isn't possible acess the memory at the address 0x8

Ah how did I miss that! 啊我怎么想念那个!

Here is your problem: 这是你的问题:

if (trie->root=NULL)

should be 应该

if (trie->root == NULL)

Note the == . 注意==

The way you have written it, you set root to NULL which evaluates to false and the root initialization is never done. 你编写它的方式,你将root设置为NULL ,其值为false并且永远不会完成根初始化。 You could figure it out by the fact that your gdb outputs 0x0 for trie->root 你可以通过你的gdb为trie->root输出0x0来解决trie->root

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM