C 大小为4的读取无效

C 大小为4的读取无效,c,valgrind,C,Valgrind,您好,我有以下代码: struct Edge { Node * nodeA, * nodeB; int weight; }; . . 这是一个简单的边缘 . . int cmp(const void *b, const void *a) { Edge * e1 = (Edge*)a; Edge * e2 = (Edge*)b; printf(" %d++", getWeight(e1)); printf(" %d++", getWeight(e

您好,我有以下代码:

struct Edge
{
    Node * nodeA, * nodeB;
    int weight;
};
.
.
这是一个简单的边缘

.
.

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的读取无效,当我输出边权重的值时,我得到了完全出乎意料的结果。我只能得出这样的结论:我的演员阵容有点问题,或者sizeof没有达到我认为的水平。如果您需要任何信息,请告诉我。

有两种方法可以更正您的代码。 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是一个边数组

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
}

有两种方法可以更正代码。 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是一个边数组

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
}

你不想要sizeofstruct Edge吗?Valgrind通常是很有描述性的。它通常会指出错误的确切位置。你能发布Valgrind报告的相关部分吗?你能发布足够的代码来编译吗?我觉得你的代码不错。我怀疑edgeList的初始化是否有任何问题。顺便说一句,我建议您使用sizeofedgeList[0]而不是sizeofEdge*。前者适用于任何类型的edgeList。您不想要sizeofstruct Edge吗?Valgrind通常非常具有描述性。它通常会指出错误的确切位置。你能发布Valgrind报告的相关部分吗?你能发布足够的代码来编译吗?我觉得你的代码不错。我怀疑edgeList的初始化是否有任何问题。顺便说一句,我建议您使用sizeofedgeList[0]而不是sizeofEdge*。以前的作品不管是哪种类型的边缘主义者。哎呀,我对普通C的知识已经有些生疏了。。。你的回答是正确的。compar参数是指向comparison函数的指针,该函数由两个指向被比较元素的参数调用。上帝啊,我爱C。非常感谢。哎呀,我对普通C的了解已经有些生锈了。。。你的回答是正确的。compar参数是指向comparison函数的指针,该函数由两个指向被比较元素的参数调用。上帝,我爱C。非常感谢你。