c - 为什么在malloc中使用sizeof?

标签 c malloc sizeof

在 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不返回已分配的内存块的大小(C 没有获取该信息的标准方法);它根据操作数的类型返回操作数的大小。由于您的指针类型为 struct A* ,操作数的大小为 struct A 类型,因此 sizeof 始终返回 8。

所以,即使你为 10000 字节的结构分配 1 个字节,你仍然会看到 sizeof返回 10000。

如果您没有为该对象分配足够的内存(例如,因为 sizeof(int) < sizeof(struct A)),但您无论如何都尝试使用该对象,您将遇到未定义的行为 - 您的程序不再正常已定义,任何事情都可能发生(什么都没有、崩溃、内存损坏、黑客拥有您的计算机)。

关于c - 为什么在malloc中使用sizeof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641228/

相关文章:

c - 将某些线程的资源分配到全局资源,这样就没有并发性(仅使用互斥体)

c - 为什么 apr_palloc 比 malloc 快?

c++ - Typedef 二维数组的大小

c - 为什么此 C 程序代码输出为 False?预期输出为真

c++ - 当一个函数有一个特定大小的数组参数时,为什么用指针替换它?

c - 如何将整数转换为字符串以在 UART 上打印整数

c - PIC 上的 USART 传输问题

c - OS X 如何使用 OpenGL 上下文创建窗口

c - C 中结构的 Malloc

c - 释放返回变量内存的正确方法