c++ - 局部变量的安全

标签 c++ c

<分区>

以下函数是否安全,返回一个指向局部变量的指针?

int * foo(void)
{
    int a = 6;
    int *p = &a;
    return p;
}

如果不是,在什么条件下? 如果是,编译器如何保证安全性?

尝试过的测试用例:

int * foo(void)
{
    int a = 6;
    int *p = &a;
    return p;
}

int * bar(void)
{
    int b = 7;
    int *p = &b;
    return p;
}

int main()
{
    int a = *foo();
    int b = *bar();
    printf("%d, %d, %d\n", 1, 2, 3); //to mess up stack
    printf("%d, %d\n", a, b);
    return 0;
}

它将成功打印“6, 7”。然而,对于 -O2,它会打印“0, 0”

最佳答案

这样做的结果将是未定义的行为,而且绝对不安全。

a 是函数的局部变量(即:自动变量),因此它存储在堆栈中。当函数返回时,栈帧上移(或下移),剩下的内存可能会被下一个调用的函数覆盖,因此指针将指向内存中的相同方向,但可以是任何随机字节。

关于c++ - 局部变量的安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21955795/

相关文章:

c - 用于设置不同类型值的单个处理程序

c - 如何从图像中计算管道数量?

c - 替换纯 C 中的链接器部分

c++ - 如何通过交叉广播恢复接口(interface)

c++ - 为什么迭代时不能使用模板

c++ - xcode构建错误: Semantic issue cast from pointer to smaller type 'int' loses information

c - 哪个 API 用于在 Windows 上加密休眠文件?

c - 如何在ARM中使用pld指令

c++ - 在构造函数中按值或 const 引用传递的参数

c++ - C++如何将参数传递给STL函数