我有一些函数返回的结构:
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
是一个自动变量,范围是局部的。因此,该引用可能会悬空,因此可能会被覆盖。
答案 0 :(得分:4)
如果我调用
struct Abc new_abc = foo();
,程序中是否有可能覆盖new_abc
中存储的结构?
是的,new_abc
只是另一个变量。如果程序希望,它可以被覆盖。
如果我理解正确,
mystruct
是一个自动变量,范围是局部的。因此,引用可能会悬空,因此可能会被覆盖。
您没有返回本地变量的地址,而是返回了值。返回结构变量在功能上与返回本地int
或char
相同。这里没有悬空的指针。
编辑:
如评论中所阐明:
“是否会被分配内存的程序覆盖其他地方”
答案是否定的。您将返回值并将其存储在变量中。当然,如果创建了太多的局部变量,则可能会遇到堆栈溢出,但是除非自动执行,否则不会收回为自动局部变量分配的内存(用于存储返回的值)超出范围。
换句话说,一旦从函数返回局部变量的值并将其存储在调用程序中的另一个变量中,该函数中的局部变量就不再存在,就可以访问调用程序中存储的值。 / p>