【问题标题】:Can a returned struct be overwritten?可以覆盖返回的结构吗?
【发布时间】:2019-08-29 13:55:58
【问题描述】:

我有一个由某个函数返回的结构:

struct Abc {
    char *a;
    int b;
};

static struct Abc foo() {
    struct Abc mystruct;
    mystruct.a = "asdf";
    mystruct.b = 1;

    return mystruct;
}

如果我调用struct Abc new_abc = foo();,存储在new_abc 中的结构是否可能被程序覆盖?

如果我理解正确,mystruct 是一个自动变量,在范围内是本地的。因此,引用可能会悬空,因此可以被覆盖。

【问题讨论】:

  • C 中正式没有references。如果你指的是指针,那么仔细看看你显示的代码没有使用指针。
  • int x = bar();struct Abc y = foo(); 的工作方式没有任何区别。它们都将函数返回的值复制到变量中。变量和参数值总是在 C 中复制,即a = b; 总是意味着将b 的内容复制到a。请注意,在指针的情况下,变量的内容是地址,它是一个数字,再次简单地从一个地方复制到另一个地方。

标签: c struct scope return-value


【解决方案1】:

如果我调用struct Abc new_abc = foo();,存储在new_abc 中的结构是否可能被程序覆盖?

是的,new_abc 只是另一个变量。如果程序(mer)希望如此,它可以被覆盖。

如果我理解正确,mystruct 是一个自动变量,在范围内是本地的。因此,引用可能会悬空,因此可以被覆盖。

您返回的不是局部变量的地址,而是值。返回结构变量在功能上与返回本地 intchar 相同。这里没有悬空指针。


编辑:

如 cmets 中所述:

“它是否会被为其他事物分配内存的程序覆盖”

答案是否定的。您正在返回值并将其存储在变量中。当然,如果你创建了太多的局部变量,你可能会面临堆栈溢出,但是为自动局部变量(用于存储返回值)分配的内存不会收回除非它去超出范围。

换句话说,一旦局部变量的值从函数返回并存储在调用者的另一个变量中,函数中的局部变量不再需要存在才能访问调用者中存储的值。

【讨论】:

  • 您好,很抱歉造成误解,但我的意思是“它是否会被为其他事物分配内存的程序覆盖?”,而不是它是否可以在代码中被覆盖。
  • @JamesTan 不,不会的;t
  • @JamesTan 你的意思是如果你再次调用 foo() ?如果这样做,每次调用它都会创建一个新的本地结构来保存该值,然后像 Sourav 所说的那样返回这个值,所以我也看不到任何潜在的问题
  • @JamesTan 刚刚更新了我的答案以更清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多