2012-03-08 2 views
1

Привет У меня есть следующий код:Invalid чтения размера 4

struct Edge 
{ 
    Node * nodeA, * nodeB; 
    int weight; 
}; 
. 
. 

Это typedef'd просто Край в другом месте.

. 
. 

int cmp(const void *b, const void *a) 
{ 
    Edge * e1 = (Edge*)a; 
    Edge * e2 = (Edge*)b; 
    printf(" %d++", getWeight(e1)); 
    printf(" %d++", getWeight(e2)); 
    if (getWeight(e1) != getWeight(e2)) 
     return (getWeight(e1) < getWeight(e2)) ? -1 : 1; 
    return 0; 
} 

void sortEdges(Edge ** edgeList, int numEdges) 
{ 
    qsort(edgeList, numEdges, sizeof(Edge*), cmp); 
} 

Valgrind говорит мне, что у меня есть недопустимое чтение размера 4, и когда я вывожу значение для краевых весов я получаю совершенно неожиданные результаты. Я могу только сделать вывод, что что-то не так с моим приведением в Edge * или что sizeof как-то не делает то, что я думаю. Если вам нужна какая-либо информация, пожалуйста, дайте мне знать.

+2

Не хотите «sizeof (struct Edge)»? – paulsm4

+0

Valgrind, как правило, довольно описательный. Он, как правило, указывает точное место ошибки. Можете ли вы опубликовать соответствующую часть отчета Valgrind? – Jay

+0

Не могли бы вы разместить достаточно кода для компиляции? –

ответ

3

Есть два способа исправить код.
1. if edgeList - это массив (Edge *).

int cmp(const void *b, const void *a) 
{ 
    Edge ** e1 = (Edge**)a;//notice 
    Edge ** e2 = (Edge**)b;//notice 
    printf(" %d++", getWeight(*e1));//notice 
    printf(" %d++", getWeight(*e2));//notice 
    if (getWeight(*e1) != getWeight(*e2))//notice 
     return (getWeight(*e1) < getWeight(*e2)) ? -1 : 1;//notice 
    return 0; 
} 

void sortEdges(Edge ** edgeList, int numEdges) 
{ 
    qsort(edgeList, numEdges, sizeof(Edge*), cmp); 
} 

2, если edgeList - это массив Edge.

int cmp(const void *b, const void *a) 
{ 
    Edge * e1 = (Edge*)a; 
    Edge * e2 = (Edge*)b; 
    printf(" %d++", getWeight(e1)); 
    printf(" %d++", getWeight(e2)); 
    if (getWeight(e1) != getWeight(e2)) 
     return (getWeight(e1) < getWeight(e2)) ? -1 : 1; 
    return 0; 
} 

void sortEdges(Edge * edgeList, int numEdges)//notice 
{ 
    qsort(edgeList, numEdges, sizeof(struct Edge), cmp);//notice 
} 
+0

К сожалению, мои знания на равнине С несколько ржавеют ... Ваш ответ правильный. «Аргумент _compar_ - это указатель на функцию сравнения, которая вызывается с двумя аргументами, которые ** указывают ** на сравниваемые элементы». http://pubs.opengroup.org/onlinepubs/009695399/functions/qsort.html – nodakai

+0

Бог, я люблю C. Большое вам спасибо. – user1256230

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