我和我的朋友在我们的代码中使用结构(我们的代码彼此分开)。让我们举个例子:
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));
答案 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 Book
是char
,它只能容纳一个字符,而不是字符串(即指针)。请改用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个字节,因为它是一个通用指针。该字段也没有被划分,因此我们无法访问该字段。
因此, 在第二种情况下,您需要在尝试使用成员之前动态分配。分配将导致适当大小和正确划分的字段。