【问题标题】:why using sizeof in malloc?为什么在 malloc 中使用 sizeof?
【发布时间】:2015-12-14 23:11:11
【问题描述】:

在 IDEONE 上执行此代码时:

#include <stdio.h>
#include <stdlib.h>

struct A{
    int x;
    char c;
};

struct B{
    int y;
};

int main(void) {
    // your code goes here
    struct A* pa = malloc(sizeof(struct B));
    printf("%d\n",sizeof(*pa));
    pa = malloc(sizeof(int));
    printf("%d\n",sizeof(*pa));
    pa = malloc(sizeof(char));
    printf("%d\n",sizeof(*pa));
    pa = malloc(0);
    printf("%d\n",sizeof(*pa));
    return 0;
}

我明白了:

8
8
8
8

我猜既然pa 的类型是struct A *struct A 的长度是8 个字节,那么malloc 应该分配8 个字节,但如果是这样,为什么要使用sizeof?

【问题讨论】:

  • 为什么使用 sizeof 而不是什么?
  • 如果你不使用sizeof,你怎么知道你需要为每个结构分配多少内存?
  • 请注意,您的第一次分配可能会分配 4 个您可以使用的数据字节,但要将该空间用作struct A,您需要 8 个字节。像Valgrind 这样的工具会抱怨访问越界内存。如果分配的内存不足,一切都会崩溃——它通常会导致缓冲区溢出。幸运的是,您在滥用它之前丢弃了分配不足的内存块(但valgrind 会抱怨泄漏)。与其他分配类似。
  • sizeof 是一个 compile-time 运算符。它不知道程序运行时指针实际上可能指向什么。它只知道您将pa 声明为指向struct A 的指针,因此它会为您提供struct A 句点的大小。如果你强迫它指向别的东西,那是你的问题。

标签: c malloc sizeof


【解决方案1】:

sizeof 不返回已分配内存块的大小(C 没有获取该信息的标准方法);它根据操作数的类型返回操作数的大小。因为你的指针是struct A*类型,sizeof操作数是struct A类型,所以sizeof总是返回8。

因此,即使您为 10000 字节的结构分配 1 个字节,您仍然会看到 sizeof 返回 10000。

如果您没有为该对象分配足够的内存(例如,因为 sizeof(int)

【讨论】:

  • 好的,谢谢。当我没有分配足够的内存时,我确实尝试过使用内存,这很好。我会把它归结为未定义的行为
猜你喜欢
  • 2013-06-19
  • 2012-07-29
  • 2014-08-13
  • 2020-12-02
  • 2017-03-05
  • 1970-01-01
  • 2013-02-19
  • 2019-11-23
  • 2015-02-10
相关资源
最近更新 更多