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;
}