gpt4 book ai didi

c - 找出 valgrind 提出的问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:26 26 4
gpt4 key购买 nike

我试图通过分配所需内存加 1 并将最后一个元素设置为 -1 来获取 C 中整数数组的大小。然后我创建一个名为 getSize 的函数来确定数组中此 -1 元素之前的元素数,这是代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int getSize(int * array)
{
int i=0;
while(1)
{
if(array[i] == -1) return i;
else i++;
}
}

int main()
{
int * array = malloc(sizeof(int)*5);
memset(array,0,5);
array[4] = -1;
printf("\nsize = %d\n",getSize(array));
return 0;
}

这只是一个测试代码,但是函数 getSize 是更大代码的一部分,我在这段代码上运行了 valgrind,这是我遇到的问题:

==1683== Conditional jump or move depends on uninitialised value(s)
==1683== at 0x100000EAE: getSize (in ./a.out)
==1683== by 0x100000F2E: main (in ./a.out)

总结如下:

==1683== HEAP SUMMARY:
==1683== in use at exit: 38,676 bytes in 425 blocks
==1683== total heap usage: 508 allocs, 83 frees, 44,948 bytes allocated

LEAK SUMMARY:
==1683== definitely lost: 36 bytes in 2 blocks
==1683== indirectly lost: 0 bytes in 0 blocks
==1683== possibly lost: 13,130 bytes in 119 blocks
==1683== still reachable: 25,510 bytes in 304 blocks
==1683== suppressed: 0 bytes in 0 blocks
==1683== ERROR SUMMARY: 22 errors from 20 contexts (suppressed: 0 from 0)

最佳答案

这段代码中有几个问题。您显示的 valgrind 输出突出了两个问题。

==1683== Conditional jump or move depends on uninitialised value(s)
==1683== at 0x100000EAE: getSize (in ./a.out)
==1683== by 0x100000F2E: main (in ./a.out)

这是由 getSize() 中的 if 语句触发的

if(array[i] ==  -1) return i;  

乍一看似乎应该没问题;在主函数中,您使用 malloc 分配内存,然后使用 memset 将其归零,然后将最后一个元素设置为 -1。

但是,让我们仔细看看

    int * array = malloc(sizeof(int)*5);
memset(array,0,5);

您分配的空间足够容纳 5 个整数,很可能是 20 个字节。然后您尝试对其进行 memset,但是 memset 当时对一个字节进行操作 - 换句话说,大小应该是以字节为单位的长度,而不是整数。因此,在此操作之后,您已将 5 个字节清零。其余内存仍未初始化。

接下来您使用数组表示法将最后一个整数设置为 -1。这意味着您有一个 20 字节的缓冲区,前 5 个字节和最后 4 个字节已初始化。

回到您的 getSize 函数,for 循环中的第一次迭代没问题,但是第二次、第三次和第四次迭代正在读取未初始化的字节,并基于此执行条件跳转。

我们在 valgrind 输出中看到的第二个错误是内存泄漏。

LEAK SUMMARY:
==1683== definitely lost: 36 bytes in 2 blocks
==1683== indirectly lost: 0 bytes in 0 blocks
==1683== possibly lost: 13,130 bytes in 119 blocks
==1683== still reachable: 25,510 bytes in 304 blocks
==1683== suppressed: 0 bytes in 0 blocks
==1683== ERROR SUMMARY: 22 errors from 20 contexts (suppressed: 0 from 0)

在 definitely lost 部分,它告诉我们你在 2 个 block 中丢失了 36 个字节。您提供的代码中实际上只有一处泄漏,即为array 分配的内存。您需要添加这一行:

free(array);

在你的函数返回之前。 Valgrind 可以为您提供有关内存泄漏的更多详细信息 - 在输出中查找提示。

关于c - 找出 valgrind 提出的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28334344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com