我正在学习c中的结构,并且很少有提示让我感到困惑 所以,如果我们有这样的结构
struct Person{
char* name;
int age;
int weight;
int height;
};
现在它是一个复合数据类型,我可以像其他数据类型一样处理.. 当我指向这个结构时
struct Person pointer=malloc(sizeof(Person));
现在c指向内存中的地址,如果结构我的问题是
A)真的知道Person由4个变量组成,名称名称,年龄,体重,身高,并将这个实体复制到指针指向的新地方吗?
B)这两种语法有什么区别?
struct Person *pointer=(Person*)malloc(sizeof(Person));
struct Person *pointer=malloc(sizeof(Person));
C)我不熟悉这个函数减速语法,所以任何人都可以清除它(函数名是指针)吗?
struct Person *Person_create(char* name, int age, int height, int weight){...}
答案 0 :(得分:0)
问题A:
是否真的知道Person由4个变量组成,名称名称,年龄,体重,身高,并将此实体复制到指针指向的新位置?
<强>答案:强>
问题第一部分的答案是'是',除非我将其重新命名为 A C编译器知道...
问题的第二部分对我来说并不清楚。我不确定你在问什么。
问题B:
这两种语法的区别是什么?
struct Person *pointer=(Person*)malloc(sizeof(Person)); struct Person *pointer=malloc(sizeof(Person));
<强>答案:强>
如果您使用
#include <stdlib.h>
位于.c文件的顶部,两者都是相同的。如果你没有那条线,那么
struct Person *pointer=(Person*)malloc(sizeof(Person));
有可能隐藏错误。有关详细信息,请参阅Do I cast the result of malloc?。
问题C:
我不熟悉这个函数减速语法,所以任何人都可以清除它(函数名是指针)吗?
struct Person *Person_create(char* name, int age, int height, int weight){...}
<强>答案:强>
如果要使用struct Person
函数族从堆中分配类型为malloc
的对象,并返回指向已分配对象的指针,则上述语法是正确的。
您还可以选择返回使用堆栈内存定义的对象。
struct Person Person_create(char* name, int age, int height, int weight){...}
您选择哪一个完全取决于您。您必须确保在为对象使用堆内存时,必须记住在指针上调用free()
。否则,您的程序将泄漏内存。
答案 1 :(得分:0)
A)不,malloc()
返回一个字节数组,它们不知道它们应该包含什么。特别是,pointer
指向未初始化的Person
,它可以包含任何内容,直到您初始化字段(或memset(pointer, 0, sizeof(Person))
)。
B)区别在于具有演员表({{1}})的演员在C中被认为是不好的练习。使用较短的演习,因为它较短并且不会隐藏潜在的错误。
C)(Person*)
不是“函数的名称是指针”,而是“返回指针的函数”。有些人会将其写为struct Person *Person_create
。