大佬教程收集整理的这篇文章主要介绍了分段错误和Valgrind没有在C中的Trie树上堆叠地址错误,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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
以上是大佬教程为你收集整理的分段错误和Valgrind没有在C中的Trie树上堆叠地址错误全部内容,希望文章能够帮你解决分段错误和Valgrind没有在C中的Trie树上堆叠地址错误所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。