使用指针或对struct的引用

时间:2016-11-16 11:58:40

标签: c pointers struct function-parameter

我和我的朋友在我们的代码中使用结构(我们的代码彼此分开)。让我们举个例子:

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));

3 个答案:

答案 0 :(得分:6)

如果是

 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是一个自动局部变量,它不会被隐式初始化为任何东西。因此,初始值(即指针指向的内存地址)是不确定的,并且非常好无效

答案 1 :(得分:4)

struct Book *obj2;
main中的

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

struct Book obj1;

分配struct Book。您可以使用其地址并修改其成员。

注意:

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

答案 2 :(得分:0)

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

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

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

struct Book * obj2; obj2 size id 4个字节,因为它是一个通用指针。该字段也没有被划分,因此我们无法访问该字段。

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