【发布时间】:2013-02-19 19:02:35
【问题描述】:
我承认这三个都有不同的含义。但是,我不明白这些具体情况适用于哪些特定情况。任何人都可以分享每个例子吗?谢谢。
malloc(sizeof(int))
malloc(sizeof(int *))
(int *)malloc(sizeof(int))
【问题讨论】:
标签: c memory allocation malloc
我承认这三个都有不同的含义。但是,我不明白这些具体情况适用于哪些特定情况。任何人都可以分享每个例子吗?谢谢。
malloc(sizeof(int))
malloc(sizeof(int *))
(int *)malloc(sizeof(int))
【问题讨论】:
标签: c memory allocation malloc
最万无一失的语法模式是:
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);总是正确,其他变体有时正确。
// Auch! 的那个)我试图说明的一点是malloc(10 * sizeof(struct mystruct))(顺便说一句:这个语法需要括号) 更容易出错(因为struct mystruct 应该对应于您想要的 actual 类型)如果您进行更改:您需要同时更改它们。
malloc(sizeof(int)) 表示您正在从堆中分配空间来存储int。您保留的字节数与int 要求的一样多。 这会返回一个你应该转换为 正如一些人所指出的,C 中的典型做法是让隐式转换来处理这个问题。int * 的值。 (指向int 的指针。)
malloc(sizeof(int*)) 表示您正在从堆中分配空间来存储指向int 的指针。您保留的字节数与指针所需的一样多。这将返回一个您应该转换为 int ** 的值。 (一个指向int的指针。)
(int *)malloc(sizeof(int)) 与第一次调用完全相同,但结果显式转换为指向 int 的指针。
请注意,在许多架构中,int 的大小与指针的大小相同,因此它们看起来(错误地)都是相同的东西。换句话说,您可能会不小心做错了事,结果代码仍然可以工作。
【讨论】:
void * 到任何指针类型的隐式转换,因此它可以工作)。见stackoverflow.com/q/605845/395760