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

使用malloc()分配内存后指针变量的大小为何不符合预期?

问题解答

你遇到的问题本质是混淆了指针变量自身的大小和指针指向的内存空间的大小两个概念,sizeof是编译期运算符,它的计算结果在编译阶段就已经确定,和运行期的内存分配、数据写入操作完全无关。

为什么malloc分配后sizeof(s)的结果不是1024?

  • 代码中定义的char *s是指针类型变量,指针的作用是存储一块内存的首地址,它本身的大小只和系统位数有关:32位系统下所有指针固定占4字节,64位系统下固定占8字节,和它指向的内存空间总大小没有任何关系。
  • sizeof的计算发生在编译阶段,编译时就已经确定s作为指针的大小是8字节,不管后续运行时用malloc分配了多少内存,取sizeof(s)的结果永远是8。你写的sizeof(s) * 1024是错误的计算逻辑,得到的8192没有实际意义,不是分配的内存实际大小。
  • C语言标准没有提供直接获取动态分配内存块总大小的语法,malloc分配的内存块的大小信息仅由底层内存分配库内部记录,用户层面无法直接通过语法获取,需要自己手动记录分配的长度。

为什么存入4个字符后计算的大小不是4?

  • 你写的sizeof(s) / sizeof(char)本质还是用指针本身的8字节除以char类型的1字节,结果自然是8,这个计算和你往指针指向的内存里写入了多少数据完全无关。
  • 只有静态数组用sizeof(数组名)才能得到整个数组的总字节数,指针和数组是完全不同的类型,不能套用数组的sizeof逻辑到指针上。如果你要统计写入的有效字符长度,需要先给字符串末尾补\0结束符,再用strlen函数计算,示例代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char *s = (char*)malloc(1024 * sizeof(char));
    s[0] = 'a';
    s[1] = 'b';
    s[2] = 'c';
    s[3] = 'd';
    s[4] = '\0'; // 手动添加C风格字符串必需的结束符
    printf("实际存入的字符串长度:%zu\n", strlen(s)); // 输出结果为4
    free(s);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:24:03