如何获取malloc分配的内存大小并验证动态分配是否正确
好的,咱们一步步来解决你的问题:
一、确认malloc动态分配是否成功
直接检查malloc的返回值就可以了!当系统没有足够内存供分配时,malloc会返回NULL。如果不检查就直接使用ptr,很容易触发段错误或者其他未定义行为。
给你修改后的代码示例:
#include <stdio.h> #include <stdlib.h> // 必须包含这个头文件才能使用malloc和exit #include <string.h> // 如果后续要做字符串拷贝等操作需要它 char buf[50]; char* ptr; size_t alloc_size = sizeof(buf) + 1; // 先把分配的大小存下来,后面有用 scanf("%s", buf); ptr = (char*)malloc(alloc_size); if (ptr == NULL) { // perror可以打印具体的错误原因,比如内存不足 perror("malloc failed to allocate memory"); // 退出程序,避免后续错误操作 exit(EXIT_FAILURE); } // 走到这里就说明分配成功了,可以正常使用ptr了
二、获取ptr指向的内存大小
这里要明确一个关键点:标准C没有提供从指针本身获取malloc分配内存大小的内置方法,因为malloc返回的指针不携带这个元数据。不过有几种可行的处理方式:
方法1:自己记录分配大小(推荐,跨平台)
像上面代码里那样,把sizeof(buf)+1存在一个变量alloc_size里,之后需要用到大小的时候直接用这个变量就行。这是最可靠、最具移植性的方式。方法2:使用平台特定的非标准函数(不推荐跨平台)
有些操作系统提供了专属函数来获取可用内存大小:- Linux/UNIX系统:可以用
malloc_usable_size(ptr),需要包含malloc.h头文件,但这个返回的是实际可用的字节数(可能比你请求的略大,因为malloc会做内存对齐) - Windows系统:可以用
_msize(ptr),需要包含malloc.h或者stdlib.h
- Linux/UNIX系统:可以用
避坑提醒:别用
sizeof(ptr)!sizeof(ptr)得到的是指针变量本身的大小,比如32位系统是4字节,64位系统是8字节,和你实际分配的内存半毛钱关系都没有,千万别搞混了。
内容的提问来源于stack exchange,提问作者Mb KIM
相关产品推荐
相关产品推荐

