C 语言中,实际上没有直接的方法来获取动态分配内存的大小(如通过 malloc() 或 calloc() 分配的内存)。C 标准库并没有提供一个函数来直接获取已分配内存的大小。尽管如此,仍有一些常见的解决方法或变通方法可以用来确定或跟踪内存的大小。

1、sizeof() 运算符

sizeof() 运算符用于确定类型或变量的大小,但它不能用于动态分配内存。如有一个指向动态分配内存的指针,使用 sizeof 计算该指针时,只会返回指针本身的大小,而不是它指向的内存的大小。

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

int main() {
    // 使用 malloc 分配 10 个整数的内存空间
    int *arr = (int *)malloc(10 * sizeof(int));
    
    // 检查内存分配是否成功
    if (arr == NULL) {
        printf("内存分配失败!\n");
        return 1;
    }

    // 打印的是指针变量 arr 的大小,而不是实际分配的内存大小
    printf("指针的大小: %zu 字节\n", sizeof(arr)); 

    // 释放分配的内存
    free(arr);

    return 0;
}

2、使用 malloc_usable_size()(GNU/Libc)

在支持 GNU C 库(glibc)的平台上,可以使用 malloc_usable_size() 函数来确定动态分配的内存的实际大小。这个函数不是 C 标准库的一部分,但在许多类 Unix 系统中是可用的。

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

int main() {
    int *arr = (int *)malloc(10 * sizeof(int));

    // 获取分配内存块的大小(以字节为单位)
    size_t size = malloc_usable_size(arr);
    printf("分配的内存大小: %zu 字节\n", size);

    free(arr);
    return 0;
}

3、手动跟踪内存大小

由于 C 标准库没有提供获取动态分配内存大小的内置机制,最常见且便携的方法是 手动跟踪内存的大小。当分配内存时,可以将大小存储在一个单独的变量中,并在需要时使用它。

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

int main() {
    size_t size = 10; // 跟踪整数的数量
    int *arr = (int *)malloc(size * sizeof(int));

    if (arr == NULL) {
        printf("内存分配失败!\n");
        return 1;
    }

    // 使用 'size' 变量来表示数组的大小
    printf("已分配内存大小: %zu 个整数\n", size);

    free(arr);
    return 0;
}

4、平台特定的解决方案(Windows)

在 Windows 平台上,如果你使用的是 Microsoft 的 C 运行时库(CRT),可以使用 _msize() 函数来获取动态分配内存块的大小。与 malloc_usable_size() 类似,_msize() 是平台特定的,只在支持 Microsoft 运行时库的系统上可用。

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

int main() {
    int *arr = (int *)malloc(10 * sizeof(int));

    // 获取分配内存块的大小(以字节为单位)
    size_t size = _msize(arr);
    printf("分配的内存大小: %zu 字节\n", size);

    free(arr);
    return 0;
}

推荐文档