为啥尽管我在变量中使用 malloc 分配更多内存,但当我打印变量的大小时,它仍然显示更少的内存/字节? [复制]

Posted

技术标签:

【中文标题】为啥尽管我在变量中使用 malloc 分配更多内存,但当我打印变量的大小时,它仍然显示更少的内存/字节? [复制]【英文标题】:Why although i'm allocating more memory with malloc in a variable, when i print the variable's size it still shows less memory/bytes? [duplicate]为什么尽管我在变量中使用 malloc 分配更多内存,但当我打印变量的大小时,它仍然显示更少的内存/字节? [复制] 【发布时间】:2021-12-31 03:36:45 【问题描述】:

比如你有c语言代码:

int *p = (int *)malloc(8);

由于某种原因,如果我打印指针 p 的大小,即使它有 8 个字节(因为我用 malloc 分配它),当我打印它时它显示为 4:

printf("%i", sizeof(p)); // results on 4

我知道一个整数的默认大小是 4,但我分配的内存比 malloc 的多,我分配了 8 个字节,当我执行 sizeof 时它仍然打印 4,为什么会这样?

【问题讨论】:

给定 int *p = ...sizeof(p) 是指针的大小。为什么 4 对于指针不合理?如果代码是int x = 42;,您希望sizeof(x) 是4 还是42? 大小应该是 8,因为我用 malloc 为指针分配了 8,而当我打印它不是,它是 4,这就是我不理解的。 sizeof(p) 是对象p 的大小,而不是它的某个赋值的值。 p 是一个指针,所以这里它的大小应该是并且是4。 那么我该如何提取对象 p 的大小? (即 8)在代码中? 如果malloc 返回一个非NULL 指针值,则大小为8,即您在malloc(8) 中请求的数量。因此,如果您想知道大小,它来自8 来自的同一个地方。 【参考方案1】:

在指针上使用sizeof 运算符将为您提供指针本身的大小,在 32 位平台上通常为 4 字节,在 64 位平台上通常为 8 字节。

在指针上使用sizeof 运算符将不会为您提供有关指针指向的对象大小的任何信息。特别是,如果指针指向malloc 分配的结果,它将不会提供有关此分配大小的任何信息。您必须自己跟踪分配的大小,例如将其存储在单独的变量中,因为 C 标准库不提供任何获取此信息的方法。

【讨论】:

以上是关于为啥尽管我在变量中使用 malloc 分配更多内存,但当我打印变量的大小时,它仍然显示更少的内存/字节? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 malloc 在我达到某个阈值之前不分配内存?

尽管有大量可用内存,但 malloc() 失败

计算机内存为啥要有堆栈区?

为啥在使用 malloc() 和 free() 后,两个内存位置会发生变化?

C语言free释放内存后为啥指针里的值不变?竟然还可以输出

C++ new的时候,为啥会存在内存分配会失败的情况?啥导致的呢?