M2 Mac下VSCode中C语言替代Windows _msize函数的问题
在M2 Mac上替代Windows _msize的方法
方法1:正确使用malloc_usable_size()
macOS原生支持malloc_usable_size(),但需满足以下前提才能正常调用:
- 必须包含头文件
<stdlib.h> - 传入的指针必须是
malloc/calloc/realloc返回的有效未释放指针(不能是NULL,也不能指向已释放的内存) - 编译时无需额外参数(clang默认支持该函数)
示例代码:
#include <stdlib.h> #include <stdio.h> int main() { int *buf = malloc(20 * sizeof(int)); if (buf == NULL) { perror("malloc failed"); return 1; } size_t usable_size = malloc_usable_size(buf); printf("实际可用大小:%zu 字节\n", usable_size); free(buf); return 0; }
如果调用失败,优先检查指针合法性、头文件是否遗漏。注意:该函数返回的是系统实际分配的内存大小,可能略大于你请求的数值。
方法2:自定义内存分配函数(跨平台方案)
若依赖系统函数存在兼容性问题,推荐自己封装分配逻辑,主动记录内存块大小:
#include <stdlib.h> #include <stdio.h> // 内部结构体,用于存储内存块的实际分配大小 typedef struct { size_t block_size; char data[]; // 柔性数组,存储用户实际使用的数据 } MemoryChunk; // 自定义malloc,返回指向实际数据区域的指针 void* my_malloc(size_t size) { MemoryChunk *chunk = malloc(sizeof(MemoryChunk) + size); if (chunk == NULL) { return NULL; } chunk->block_size = size; return chunk->data; } // 自定义_msize,获取分配的内存大小 size_t my_msize(void* ptr) { if (ptr == NULL) { return 0; } // 从数据指针偏移到结构体头部,读取记录的大小 MemoryChunk *chunk = (MemoryChunk*)((char*)ptr - sizeof(MemoryChunk)); return chunk->block_size; } // 自定义free,释放整个结构体内存 void my_free(void* ptr) { if (ptr != NULL) { MemoryChunk *chunk = (MemoryChunk*)((char*)ptr - sizeof(MemoryChunk)); free(chunk); } } int main() { char *buf = my_malloc(150); if (buf == NULL) { perror("my_malloc failed"); return 1; } printf("分配的大小:%zu 字节\n", my_msize(buf)); my_free(buf); return 0; }
该方案完全不依赖平台特定函数,在Windows和macOS上均能正常工作,且能准确返回你主动请求分配的大小。
内容的提问来源于stack exchange,提问作者woowon
相关产品推荐
相关产品推荐

