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