2016-03-06 101 views
0

下午好!這是我第一次發帖!使用valgrind和gdb進行調試

當我使用valgrind時,我有一個無效的寫入錯誤,但是當我使用gdb時我可以計算出它!

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_INDEX 2 

void *z_m = 0; 
struct block { 
    struct block * suiv; 
}; 

//Declaration of a global array 
struct block * tzl[MAX_INDEX+1]; 

//Function used to dislay tzl in the main. 
void display() { 
    for(int i=0; i<=MAX_INDEX; i++) { 
     struct bloc * tmp = tzl[i]; 
     printf("%d => ",i); 
     while (tmp!=NULL) { 
      printf(" %li ->",(unsigned long)tmp); 
      tmp = tmp -> suiv; 
     } 
     printf("\n"); 
    } 
} 

int main() { 
    z_m = (void *) malloc(1<<MAX_INDEX); 
    for (int i=0; i<MAX_INDEX; i++) 
    { 
     tzl[i] = NULL; 
    } 
    tzl[MAX_INDEX] = z_m; 
    //Here is the problem with valgrind 
    tzl[MAX_INDEX] -> suiv = NULL; 
    display(); 
    free(z_m); 
    return 0; 
} 

可能是什麼問題?謝謝你的回答。

+0

能否請你解釋一下(或者換一種說法)「但是當我使用gdb的時候我能想到它」? –

+0

順便說一句,你的符號(函數和變量)的名字實際上是不可讀的(至少對於普通的英語讀者來說,這是問題的預期發佈方式)。 –

+0

對不起!我試着添加一些評論。當我使用gdb時,進程正常終止,這對於我考慮valgrind中的錯誤是很奇怪的! –

回答

1

你用一個指針初始化tzl[2] 4個字節的塊:

tzl[MAX_INDEX] = z_m; /* z_m is malloc(4) */ 

但後來你是把它當作一個指向struct block

tzl[MAX_INDEX] -> suiv = NULL; 

聲明z_mstruct block *和變化malloc(1<<MAX_INDEX)malloc(sizeof(struct block))作爲開始。

您還應該檢查以確保malloc未返回NULL,並且您應該避免投射malloc的返回值。

+0

好的!謝謝親愛的,它在某種程度上有所幫助! 但是,你知道爲什麼gdb可以找出錯誤嗎? –

+0

gdb不檢查你是否不會濫用內存。這裏的誤用是輕微的,你很可能會「放棄它」(也就是說,即使代碼有問題,代碼似乎也能正常運行)。 valgrind更仔細地檢查。 valgrind很高興爲你找到了問題。 –