C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了分段错误和Valgrind没有在C中的Trie树上堆叠地址错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在用C语言写一个Trie Tree,结构如下:

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

typedef struct {
     Node *root;
} Trie;

但是我在这个插入函数中遇到了问题:

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;
}

函数接收指向树和字符串的指针.如果Trie的根是NULL,它会创建一个节点,在此之后,它会在数组上搜索要存储的空闲(NULL)位置.

问题出在这一行:

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

它在我执行此操作时给出了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

并以这种方式使用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==   @R_74_10586@l 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

我非常感谢任何帮助.谢谢!

==== ====编辑
崩溃时的值:

(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 ===
要求的其他价值:

(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

解决方法

啊我怎么想念那个!

这是你的问题:

if (trie->root=NULL)

应该

if (trie->root == NULL)

注意==.

你编写它的方式,你将root设置为NULL,其值为false,并且永远不会完成根初始化.你可以通过你的gdb为trie-> root@L_450_11@0x0来解决这个问题

大佬总结

以上是大佬教程为你收集整理的分段错误和Valgrind没有在C中的Trie树上堆叠地址错误全部内容,希望文章能够帮你解决分段错误和Valgrind没有在C中的Trie树上堆叠地址错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。