使用指向结构的指针或引用

Using pointers or references to 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);
}

编辑: 我在声明中并不清楚。我已经将 pinter 初始化为

struct Book *obj2 = malloc(sizeof(struct obj2));

如果

 struct book obj1;
 setBook(&obj);

您正在向函数传递有效地址#1,因此定义了行为。

另一方面,

struct Book *obj2;
setBook(obj2);

您正在传递一个单元化指针#2,访问它会调用 undefined behavior.

也就是说,成员 char title; 应该是 char *title;,因为 字符串文字 ,当用作初始值设定项时,会衰减到指向第一个的指针元素,所以你需要在 LHS 上有一个指针。


#1 -- obj1是一个自动局部变量,该变量的地址是范围内的有效地址。

#2 -- struct Book *obj2; 定义了一个指针,obj2 是一个自动局部变量,它没有被隐式初始化为任何东西。因此,初始值(即指针指向的内存地址)是不确定的,而且很好 invalid.

struct Book *obj2;

in main 只是一个具有不确定值的指针。它不指向您分配的任何内容。您可以取消引用它,但这是未定义的行为。

struct Book obj1;

分配一个struct Book。您可以使用它的地址并修改它的成员。


备注:

  • title 来自 struct Book 是一个 char,它只能容纳一个字符,而不是字符串(即指针)。请改用 char *const char *

在第一种情况下,您将 'struct Book' 类型的变量传递给 'setBook 函数。由于您声明了变量,因此 obj1 -s sizeof(setBook) 占用的总内存即 sizeof(char)+sizeof(int) 等于 5 个字节。因此你可以访问 obj1 .title(1 字节) 和 obj1.pages(4 字节).

注意:- 假设 int 是 4 字节长。

让我们看看第二种情况会发生什么。

结构书*obj2; obj2 size id 4 bytes 因为它是一个通用的 pointer.The 字段也没有划分,因此我们无法访问该字段。

因此, 在第二种情况下,您需要动态分配,然后再尝试使用 members.The 分配将导致适当大小和适当划分的字段。