C语言 使用 malloc 的 GNU 缓冲区溢出



我在循环中运行以下函数:

int* rpermute(int n)
{
    int* a = malloc(n * sizeof(int));
    int  k;
    for (k = 0; k < n; k++)
    {
       a[k] = k;
    }
    for (k = n - 1; k > 0; k--)
    {
       int j    = rand() % (k + 1);
       int temp = a[j];
       a[j]     = a[k];
       a[k]     = temp;
   }
   return a;
}

如果我在我的代码中设置一个新的 int 变量,每个变量都在变化,我认为这是一个缓冲区溢出问题。

运行瓦尔格林德,我得到以下内容:

==4459== 73,036 bytes in 19 blocks are definitely lost in loss record 1 of 1
==4459==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4459==    by 0x402CFB: rpermute (in /home/giwrgos/Desktop/crowdv22/crowd_evacuation)
==4459==    by 0x403378: main (in /home/giwrgos/Desktop/crowdv22/crowd_evacuation)

我通过虚拟盒子使用 linux,但我设置了足够的存储空间和内存,我该怎么办?

编辑:请参阅下面的海报评论,问题毕竟在此代码中。

您应该简单地free() 中分配并由 rpermute() 返回的内存。 这必须在您调用 rpermute() 的代码中完成,一旦您完成了这个数组。

我知道您为不同的int值(rpermute()n 参数)重新生成此数组。 也许你只是为你保留的数组分配一个新的输出:

int* array;
...
array = rpermute(100);
// Some time later.
array = rpermute(200);  // Previous array memory is leaking.

您应该改为:

free(array);
array = rpermute(200);

请注意,这不是"缓冲区溢出流",而是内存泄漏。 我检查了缓冲区溢出的代码:它外面的 a 个点的索引,但这在两个循环中似乎都可以。

相关内容

  • 没有找到相关文章

最新更新