【问题标题】:Invalid read of size 4大小为 4 的无效读取
【发布时间】:2012-03-08 04:18:56
【问题描述】:

你好,我有以下代码:

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 在某种程度上没有按照我的想法进行。如果您需要任何信息,请告诉我。

【问题讨论】:

  • 你不想要“sizeof(struct Edge)”吗?
  • Valgrind 通常具有很强的描述性。它通常会指出错误的确切位置。你能发布 Valgrind 报告的相关部分吗?
  • 你能发布足够的代码来编译吗?
  • 您的代码对我来说看起来不错。我怀疑edgeList 的初始化是否有任何问题。顺便说一句,我建议您使用sizeof(edgeList[0]) 而不是sizeof(Edge*)。无论edgeList 的类型如何,前者都有效。

标签: c valgrind


【解决方案1】:

有两种方法可以更正您的代码。
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
}

【讨论】:

  • 糟糕,我对普通 C 的了解有些生锈了……您的答案是正确的。 “compar 参数是一个指向比较函数的指针,该函数使用两个参数调用,point 指向被比较的元素。” pubs.opengroup.org/onlinepubs/009695399/functions/qsort.html
  • 上帝,我爱 C。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
相关资源
最近更新 更多