【问题标题】:Using pointers or references to struct使用指向结构的指针或引用
【发布时间】:2016-11-16 11:58:39
【问题描述】:

我和我的朋友在我们的代码中使用了结构(我们的代码是相互独立的)。举个例子:

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

【问题讨论】:

  • 在第一个 sn-p 中:char title; -> char *title;
  • 是的,有区别。一种会起作用,一种不会起作用。
  • @SamVarshavchik 可能有用*
  • 你真的在编译c++吗?我强烈怀疑你没有
  • struct Book *obj2 = malloc(sizeof(struct obj2)); 无法编译,请出示实际代码。

标签: c pointers struct function-parameter


【解决方案1】:

万一

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

【讨论】:

  • 假设我确实初始化了指向地址的指针,那会有什么不同?
  • @EmilMøllerRinggaard an address 是什么?它有效吗?你怎么知道的?
  • 它在微处理器上并且可以编译,所以我认为它可以工作
  • @EmilMøllerRinggaard 这取决于,两者都是有效的。经验法则是,如果您可以避免使用动态内存分配malloc() 和系列,请避免使用它们。仅在必要时使用它们。
  • @EmilMøllerRinggaard 我会说,是的。
【解决方案2】:
struct Book *obj2;

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

struct Book obj1;

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


注意事项:

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

【讨论】:

    【解决方案3】:

    在第一种情况下,您将“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,因为它是一个通用指针。该字段也没有被分割,因此我们无法访问该字段。

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

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 2018-11-03
      • 2020-09-12
      • 1970-01-01
      相关资源
      最近更新 更多