C++,访问在其他方法中声明的非全局变量

标签 c++ pointers

<分区>

此代码获取函数返回的值,创建并将其放入名为变量“b”的新地址空间

    int main()
{
    int b;
    b = topkek();
    std::cout << &b;


};

int topkek()
 {
    int kek = 2;

    return kek;

 };

现在我明白了,因为变量 kek 在 topkek 方法中,所以我无法从 main() 方法访问它。使用 C++ 和指针,我想出了如何访问在方法内声明的变量,即使在方法终止后,看看这段代码。

int main()
{
    int * a;
    a = topkek();  //a is now pointing at kek

    std::cout << *a; //outputs 2, the value of kek.

    *a = 3;

    std::cout << *a; //output 3, changed the value of kek.

    std::cin >> *a;


};

int * topkek()
 {
int kek = 2;
    int* b = &kek;  //intializing pointer b to point to kek's address in stack

    return b; //returning pointer to kek

};

这种方法安全吗?编译器会阻止 kek 的地址空间在稍后的代码中被覆盖,因为它仍然理解它正在被使用吗?

最佳答案

这是未定义的行为:一旦函数完成,通过指针或引用访问其中的变量会使程序无效,并可能导致崩溃。

但是,当您“返回”堆栈时访问变量是完全有效的:

void assign(int* ptr) {
    *ptr = 1234;
}
int main() {
    int kek = 5;
    cout << kek << endl;
    assign(&kek);
    cout << kek << endl;
}

请注意 assign 如何访问在另一个函数内声明的局部变量的值。这是合法的,因为 main 在访问发生时尚未完成。

关于C++,访问在其他方法中声明的非全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18189578/

相关文章:

c++ - 将文件内容作为参数传递给 C++ 程序

c++ - 我可以在#include 指令中使用预处理器变量吗?

C++ 回调数组

c++ - 当我只有一个指向数据的空指针时,使用 printf 打印字符

c - 函数指针的别名

java - 看不懂引用资料

C 将指针传递给指向函数的指针并使用 malloc

c++ - 是否可以调试包含 XS 部分的 Perl 以查看程序流程?

c++ - 'base' 不再是 C++ 中迭代器的成员

c++ - 在 LLVM 中间接调用时如何从 CallInst 获取 FunctionType