理解“无效读取大小n”

时间:2013-04-26 02:49:36

标签: c valgrind

我已经阅读了关于这个Valgrind错误的几个主题,其中大多数都提供了本地化的响应。我想确切地知道出了什么问题,以便我将来可以调试这些错误。

我只会发布相关代码,如果有人想要更多,我也会发布相关代码..

所以我在这一行上有一个Invalid read of size 4

int t = (p->acts+p->ac)->time;

注意我认为可能涉及错误的指针算法

我在这一行遇到同样的错误,访问同一个成员:

next->time = next->acts[next->ac].time;

我如何进行调试...程序运行正常,但我想知道发生了什么。

如果您需要更多信息,请发表评论。

1 个答案:

答案 0 :(得分:1)

该错误表明next->acp->ac)是超出分配给next->actsp->acts)的内存末尾的值

...即

next->acts = malloc( sizeof( something ) * count );
next->ac = count;

next>acts[next->ac].time = 0;

这会引发错误,因为count作为数组索引实际上超过了数组的大小(基数为零,所有这些)

换句话说,next->ac >= count会在我给出的示例中抛出该错误。

您的程序可能正常工作,因为访问已分配内存的末尾是未定义的行为。它可以工作,或者它可以自发地导致谁知道什么是混乱。但是,同样的,访问分配内存的末尾是一个错误。