【问题标题】:malloc(sizeof(int)) vs malloc(sizeof(int *)) vs (int *)malloc(sizeof(int))malloc(sizeof(int)) vs malloc(sizeof(int *)) vs (int *)malloc(sizeof(int))
【发布时间】:2013-02-19 19:02:35
【问题描述】:

我承认这三个都有不同的含义。但是,我不明白这些具体情况适用于哪些特定情况。任何人都可以分享每个例子吗?谢谢。

       malloc(sizeof(int))
       malloc(sizeof(int *))
(int *)malloc(sizeof(int))

【问题讨论】:

    标签: c memory allocation malloc


    【解决方案1】:

    最万无一失的语法模式是:

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

    如果 *p 的类型(和/或大小...)发生变化,这种语法不会强迫您更改代码,例如在

     struct mysstruct *q;
     q = malloc (cnt * sizeof *q);
    

    这样可以避免类似的问题

    struct mysstruct *z;
    z = malloc (cnt * sizeof(struct hisstruct)); // Auch!
    

    ,另外:sizeof expr 形式也更短。


    更新:证明p = malloc(CNT * sizeof *p)这个测试程序的正确性:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct mystruct {
            int i;
            char s[14];
            };
    int main(void)
    {
    struct mystruct *p;
    size_t siz;
    
    siz = sizeof p;
    printf("Sizeof p := %zu\n", siz);
    
    siz = sizeof *p;
    printf("Sizeof *p := %zu\n", siz);
    
    printf("Allocating %zu (%u structs, each of size %zu) bytes to be assigned to p...\n"
            , 10u * sizeof *p
            , 10u, sizeof *p
            );
    p = malloc(10 * sizeof *p);
    
    return 0;
    }
    

    这里的输出:

    Sizeof p := 8
    Sizeof *p := 20
    Allocating 200 (10 structs, each of size 20) bytes to be assigned to p...
    

    【讨论】:

    • 该模式不是malloc (cnt * sizeof *p),而是正确指出的接受答案sizeof p。与 q/*q 相同。否则,您需要int **p 才能正确保存结果。
    • 我不明白你的问题。 Type *t; t = malloc(CNT * sizeof *t);总是正确,其他变体有时正确。
    • @snd 你错了;我在答案中添加了一个 sn-p。
    • 我不打算为指针(那将是无用的)或 10 个指针分配内存,我打算为 10 个结构分配内存。而且它不是“非标准语法”(不管是什么)
    • 我在第三部分解释了(带有// Auch! 的那个)我试图说明的一点是malloc(10 * sizeof(struct mystruct))(顺便说一句:这个语法需要括号) 更容易出错(因为struct mystruct 应该对应于您想要的 actual 类型)如果您进行更改:您需要同时更改它们。
    【解决方案2】:

    malloc(sizeof(int)) 表示您正在从堆中分配空间来存储int。您保留的字节数与int 要求的一样多。 这会返回一个你应该转换为int * 的值。 (指向int 的指针。) 正如一些人所指出的,C 中的典型做法是让隐式转换来处理这个问题。

    malloc(sizeof(int*)) 表示您正在从堆中分配空间来存储指向int 的指针。您保留的字节数与指针所需的一样多。这将返回一个您应该转换为 int ** 的值。 (一个指向int的指针。)

    (int *)malloc(sizeof(int)) 与第一次调用完全相同,但结果显式转换为指向 int 的指针。

    请注意,在许多架构中,int 的大小与指针的大小相同,因此它们看起来(错误地)都是相同的东西。换句话说,您可能会不小心做错了事,结果代码仍然可以工作。

    【讨论】:

    • 最后一段 +1 - 但是根据我的经验,许多 C 程序员“故意”做错事并且它有效,所以他们继续这样做.....
    • RE 第一段:在 C 中,许多人认为您不应该强制转换它(在 C 中存在从 void * 到任何指针类型的隐式转换,因此它可以工作)。见stackoverflow.com/q/605845/395760
    • @StevenBurnap 我怀疑您实际上是指“使用”,而您说“演员”。有一个从 void* 到任何其他数据指针类型的隐式转换(我不记得标准是否说您可以安全地将 void* 转换为函数指针)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2014-08-13
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多