You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:50:27