结构提示令人困惑

时间:2015-02-09 03:05:10

标签: c struct

我正在学习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){...}

2 个答案:

答案 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