我只是想知道malloc(sizeof(* some_structure))和malloc(sizeof(some_structure))之间的区别。
我刚学习C语言,最近我遇到了一些问题。我很抱歉新手问题,但我不知道如何在谷歌上搜索它。
答案 0 :(得分:3)
让我们说你有
typedef struct some_structure {
int a;
int b;
int c;
} some_structure;
int main(void)
{
some_structure *hello = NULL;
}
hello
是some_structure *
的类型:' s"结构指针"。*hello
是some_structure
的类型:那是" some_structure"。对于每个指针级别都会发生同样的情况:
int main(void)
{
some_structure **hello = NULL;
}
hello
是some_structure **
的类型:' s"指针结构&#34 ;. *hello
是some_structure *
的类型:那是" s#34; some_structure的指针"。**hello
是some_structure
的类型:那是" some_structure"。当你使用malloc时,你想为结构本身分配内存。然后你想要malloc some_structure
本身的类型。
这就是您通常使用*some_structure
的原因。
为什么不直接使用sizeof(some_structure)
?
因为如果您的变量类型发生了变化。
使用some_structure *hello = malloc(sizeof(*hello))
,即使您更改hello
的类型,malloc仍然有效。
答案 1 :(得分:1)
第一个是获取空间,其大小由一个名为some_structure
的指针所指向的变量指示,这是指针的奇怪命名。
第二个是获取空间,其大小由名为some_structure
的变量指示,对于包含类似于整数的变量的变量也是奇怪的命名。
注意,其他人已经发现变量的命名非常奇怪,他们(默默地)认为你问的是一个完全不同的问题。这里的答案试图(可能稍微固执地)回答所提出的问题 请考虑澄清您的问题。如果看似合理的猜测是正确的,你会发现很多答案已经存在 (我会删除我的,如果有人吩咐我并给我几个小时的时间,因为我现在必须离开。)
答案 2 :(得分:0)
查看malloc的定义here,您可以看到malloc函数需要size_t size
参数。
因此,区别在于您请求分配的大小:指向some_struct的指针,或结构本身的大小。
请注意,为了正确传递请求的大小,您必须使用sizeof()
:
malloc(sizeof(*some_structure))
或malloc(sizeof(some_structure))
答案 3 :(得分:0)
请参阅以下代码以了解其中的区别:
struct abc
{
int a, b, c;
char d, e, f;
};
int main(){
abc a;
abc *b;
printf("%zu %zu",sizeof(a), sizeof(b));
}
输出是:
16 8
指针的类型为long unsigned int
,这就是大小为8的原因。
对于struct abc
,size = 4 * 3 + 1 * 3 = 15(为填充添加1)
在执行some_struct
时,您正在分配该结构的完整内存,而在第二种情况下(*some_struct
),您只为内存分配指针。
答案 4 :(得分:0)
你的问题并不是很清楚,因为它缺乏真正的代码甚至是你真正在谈论的真正定义。但我希望这可能会对这个话题有所启发。
#include <stdio.h>
#include <stdlib.h>
struct a{
int b;
long long int c;
};
int main()
{
struct a *foo; //this is just a pointer to not allocated memory
foo = malloc(sizeof (*foo)); //allocation of the struct for the pointer
foo->b = 2;
foo->c = 3;
struct a **bar; // pointer to the pointer of struct;
bar = malloc(sizeof (foo)); //size of a pointer
*bar = foo;
printf("%d\n",(*bar)->b); //bar is a pointer to foo that points to your memory for the struct
printf("size of pointer %d\n",sizeof foo);
printf("size of struct %d\n",sizeof *foo);
}