使用指向结构的指针或引用
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 分配将导致适当大小和适当划分的字段。
我和我的朋友在我们的代码中使用结构体(我们的代码彼此独立)。让我们举个例子:
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 分配将导致适当大小和适当划分的字段。