使用指针或对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个字节,因为它是一般指针。字段也没有被划分,因此我们无法访问该字段。

因此,在第二种情况下,您需要在尝试使用成员之前动态分配。分配将导致适当大小和正确划分的字段。