C语言 Valgrind显示分配的内存比实际多

qni6mghb  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(168)

我用C写了一些简单的代码来测试一些内存分配和指针:

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

int *randomAlloc(int n) {
    int *address = NULL, i = 0;

    address = malloc (n * sizeof(int));
    for (i = 0; i < n ; i++){
        *(address + i) = i ;
    }
    return address;

}

int main(int argc, char* argv[] ) {

    int *address;
    int n;
    printf("Type vector size: ");
    scanf("%d", &n);
    address = randomAlloc(n);

    free(address);
}

然而由于某种原因,当我输入4作为输入时,valgrind输出:

==2375== Memcheck, a memory error detector
==2375== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==2375== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==2375== Command: ./a.out
==2375== 
Type vector size: 4
==2375== 
==2375== HEAP SUMMARY:
==2375==     in use at exit: 0 bytes in 0 blocks
==2375==   total heap usage: 3 allocs, 3 frees, 2,064 bytes allocated
==2375== 
==2375== All heap blocks were freed -- no leaks are possible
==2375== 
==2375== For counts of detected and suppressed errors, rerun with: -v
==2375== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

在代码中只有一个alloc和一个free。当n = 4时,我希望它alloc 4*4(sizeof(int))=16字节。这是从哪里来的?

3mpgtkmj

3mpgtkmj1#

Valgrind会跟踪应用程序中发生的 * 所有 * 内存分配,包括由C库在内部进行的分配。它不(也不能)限于您显式进行的分配,因为C库可以返回指向它在内部分配的内存的指针。
许多标准I/O实现将分配缓冲区供printf()和/或scanf()使用,这可能就是您看到的数字的原因。

ego6inou

ego6inou2#

您应该只有一个内存分配给'address'指针的内存空间。其他两个内存分配是给printf和scanf函数的。
为了证明这一点,注解掉printf和scanf语句,当您使用valgrind执行程序时,您应该看到1个alloc和1个free ...

相关问题