使用指针或对struct的引用
我和我的朋友在我们的代码中使用结构(我们的代码彼此分开)。 让我们看看以下示例:
struct Book { char title; int pages; } void setBook(struct Book *tempBook) { tempBook->title = "NiceTitle"; tempBook->pages = 50; }
上面的代码很简单。 问题是,拥有这两个主电源是否有任何区别:
int main() { struct book obj1; setBook(&obj); }
要么
int main() { struct Book *obj2; setBook(obj2); }
编辑:我的发言中并不清楚。 我已经将品酒初始化为
struct Book *obj2 = malloc(sizeof(struct obj2));
的情况下
struct book obj1; setBook(&obj);
您将有效地址#1传递给函数,因此定义了行为。
另一方面,
struct Book *obj2; setBook(obj2);
你正在传递一个单元化的指针#2 ,访问它会调用未定义的行为 。
那说,会员char title;
应该是char *title;
,作为字符串文字 ,当用作初始化程序时,衰减到指向第一个元素的指针,因此您需要LHS上的指针。
#1 – obj1
是一个自动局部变量,该变量的地址是范围内的有效地址。
#2 – struct Book *obj2;
定义一个指针,再次, obj2
是一个自动局部变量,它不会被隐式初始化为任何东西。 因此,初始值(即指针指向的内存地址)是不确定的,并且非常无效 。
struct Book *obj2;
在main
中只是一个具有不确定值的指针。 它并不指向您分配的任何内容。 您可以取消引用它,但这是未定义的行为。
struct Book obj1;
分配一个struct Book
。 您可以使用其地址并修改其成员。
笔记:
-
struct Book
中的title
是一个char
,它只能包含一个字符,而不是一个字符串(即指针)。 请改用char *
或const char *
。
在第一种情况下,您将’struct Book’类型的变量传递给’setBook函数。 由于您声明了变量因此obj1 -s sizeof(setBook)占用的总内存,即sizeof(char)+ sizeof(int)等于5个字节。 因此,您可以访问obj1 .title(1个字节)和obj1.pages(4个字节)。
注意: – 假设int长4个字节。
让我们看看第二种情况会发生什么。
struct Book * obj2; obj2 size id 4个字节,因为它是一般指针。字段也没有被划分,因此我们无法访问该字段。
因此,在第二种情况下,您需要在尝试使用成员之前动态分配。分配将导致适当大小和正确划分的字段。