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

C语言中如何获取char*类型变量PE的实际内存大小?

问题分析与解决方案

核心原因

PE是char*类型的指针,在64位系统中,指针本身的大小固定为8字节,所以sizeof(PE)永远返回8,和你malloc分配的内存块大小无关。sizeof(mycode)能返回正确的270,是因为mycode是数组类型,sizeof会计算整个数组的字节数,但一旦退化为指针(比如赋值给char*变量),sizeof就只会计算指针本身的大小。

解决方法

  1. 直接复用已有的size变量
    你已经在代码开头获取了正确的大小size_t size = sizeof(mycode);,后续需要用到大小时直接用这个变量即可,比如修改打印语句:

    printf("Shellcode size before return : %zu\n", size);
    

    (%zu是格式化size_t类型的标准写法)

  2. 封装指针与大小为结构体返回
    如果需要在返回指针的同时携带大小信息,可以定义一个结构体:

    typedef struct {
        char* data;
        size_t size;
    } Buffer;
    
    // 在函数中返回这个结构体
    Buffer get_shellcode() {
        size_t size = sizeof(mycode);
        char* PE = malloc(size);
        memcpy(PE, mycode, size); // 用memcpy替代手动循环更高效
        Buffer buf = {PE, size};
        printf("Shellcode size before return : %zu\n", buf.size);
        return buf;
    }
    

    调用函数后,就能通过结构体的size字段拿到正确的内存块大小。

  3. 禁止用strlen计算大小
    shellcode二进制数据中很可能包含\0字节(ASCII空字符),strlen会在遇到第一个\0时停止计数,导致得到的长度远小于实际大小,绝对不能用它来计算二进制数据的长度。

内容的提问来源于stack exchange,提问作者Brozovitch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:30:33