2016-03-06 6 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

BTW, ваши символы (функции и переменные) являются практически нечитаемыми (по крайней мере, для обычного читателя на английском языке, который, как ожидается, будет размещен здесь). –

+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_m в struct block * и изменениях malloc(1<<MAX_INDEX) - malloc(sizeof(struct block)) для начала.

Вы также должны проверить, чтобы malloc не возвратил NULL, и вам, вероятно, следует воздержаться от литья возвращаемого значения malloc.

+0

Хорошо! Спасибо, дорогая, это помогает в некотором роде! Но вы знаете, почему gdb может выяснить ошибку? –

+0

gdb не проверяет, чтобы вы не злоупотребляли памятью. Неправильное использование здесь незначительное, и вы, скорее всего, «уйдете с ним» (то есть код, похоже, будет работать корректно, даже если он имеет проблему). valgrind проверяет гораздо более тщательно. Хорошо, что valgrind нашел для вас проблему. –

Смежные вопросы