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

时间:2013-03-05 04:25:41

标签: c memory allocation malloc

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

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

2 个答案:

答案 0 :(得分:42)

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

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

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

请注意,在许多体系结构中,int与指针的大小相同,因此这些似乎(错误地)完全相同。换句话说,你可能会意外地做错事,并且生成的代码仍然有用。

答案 1 :(得分:6)

最简单的语法模式是:

 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...