【问题标题】:How does malloc distinguish between me allocating a long long integer and an array of two integers?malloc 如何区分我分配一个 long long 整数和一个由两个整数组成的数组?
【发布时间】:2021-02-13 09:06:57
【问题描述】:

在我的操作系统中 long long int 是:8 个字节。 int 是 4 个字节。

int *p = malloc(4);

此代码在堆上为整数类型的变量分配 4 个字节。

int *p = malloc(8);

这将分配一个长整数,如“一个变量”或数组上的两个项目。

如何分配一个 8 字节长的整数? 如何分配一个包含 2 个项目的数组?

【问题讨论】:

  • malloc() 对数据类型一无所知,它只是分配内存。
  • malloc() 不关心数据类型的大小。在分配大小 * 您的数据类型大小的内存时,由您来计算。
  • 相关:stackoverflow.com/questions/605845/…(对问题的第一个评论和接受的答案)

标签: c memory malloc allocation


【解决方案1】:

如果你想要一个 8 字节的整数,它被称为 long longint64_t/int64_t

如果这是关于 C 的,那么你使用 malloc:

int64_t* p = malloc(sizeof(int64_t));

如果这是关于 C++,那么你使用 new:

int64_t* p = new int64_t;

使用您的原始代码,您将获得一个 任意大小 的分配映射到 固定大小类型 的指针,其中 int 通常为 4 个字节,或者换句话说,你有空间给int[2]

注意:出于可移植性的原因,最好用基本类型来表达您的分配,而不仅仅是抽象数字。 malloc(8) 可能会为 2 x int 分配内存,也可能不会,这取决于 sizeof(int) 是什么。 malloc(sizeof(int) * 2) 始终正常工作。

【讨论】:

    【解决方案2】:

    malloc() 只是分配原始内存,它是被视为数组还是单个变量取决于调用者如何使用内存。

    int *p = malloc(2 * sizeof(int));
    

    将内存视为 2 个int 的数组。然后你可以这样做:

    p[0] = 1;
    p[1] = 2;
    

    它会在内存中写入两个int

    long int *p = malloc(sizeof(long int));
    

    将内存视为单个long int(或等效地,1 个long int 的数组)。然后你可以这样做:

    *p = 12345678;
    

    它会将那个长整数写入内存。

    它们都将在int 为 4 字节,long int 为 8 字节的系统上分配 8 字节内存。

    【讨论】:

    • 所以我需要指定指针类型(long int *p=) 以便程序知道我想要一个长整数而不是 2 个整数的数组
    • 是的。当您使用p 时,它使用它的类型来知道如何解释它指向的内存。
    • 这就是你必须指定指针类型的原因。
    • 如果我执行 int *p=malloc(5) 会发生什么
    • 取消引用指针时将使用分配的前 4 个字节,多余的字节将被忽略。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多