Неверное чтение размера 4 - PullRequest
1 голос
/ 08 марта 2012

Здравствуйте, у меня есть следующий код:

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

Это typedef'd для простого 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)
{
    qsort(edgeList, numEdges, sizeof(Edge*), cmp);
}

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

1 Ответ

3 голосов
/ 08 марта 2012

Есть два способа исправить ваш код.
1. если 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
}
...