首页 > 解决方案 > 可以覆盖返回的结构吗?

问题描述

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

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它是一个范围内本地的自动变量。因此,引用可能会悬空,因此可以被覆盖。

标签: cstructscopereturn-value

解决方案


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

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

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

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


编辑:

正如评论中所阐明的:

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

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

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


推荐阅读