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

C++ C++;,访问在其他方法中声明的非全局变量,c++,pointers,C++,Pointers,此代码获取函数返回的值,创建并将其放入名为变量“b”的新地址空间中 int main() { int b; b = topkek(); std::cout << &b; }; int topkek() { int kek = 2; return kek; }; intmain() { int b; b=topkek(); std::cout绝对不安全。将导致未定义的行为。这是未定义的行为:一旦函数完成,通过指针或

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

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


};

int topkek()
 {
    int kek = 2;

    return kek;

 };
intmain()
{
int b;
b=topkek();

std::cout绝对不安全。将导致未定义的行为。

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

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

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

cout这是,
kek
是一个局部变量,它所在的内存将在退出
topkek
后被释放。它可能看起来有效,但由于它未定义,因此可能导致任何结果,它随时都可能中断,您无法依赖结果。

不,这是不安全的。在您的函数完成执行后,您不是p指向一个
int
,但只指向内存中的某个随机位置。它的值可以是任何值,因为它可以在程序中的其他位置修改。

本地分配的自动类型将在退出函数作用域时自动解除分配。然后返回的指针将指向解除分配的内存。访问此内存y将导致

int*topkek(){
int-kek=2;//创建一个本地int-kek
int*b=&kek;//声明指向kek的指针

返回b;//返回指向局部变量的指针。这是未定义的行为。从函数返回后,
kek
不再存在,返回的指针指向nirvana,指向
kek
曾经所在的位置。访问它会给出未定义的行为。未定义的行为意味着,任何事情都可能发生。您可以您需要获取曾经在
kek
中的值,或者您的应用程序崩溃,或者您得到一些垃圾值,或者您的编译器认为适合在线为您订购一个比萨饼,请加上额外的奶酪。

这将是安全的:

int * topkek()
{
    static int kek = 2;
    int* b = &kek;  //intializing pointer b to point to kek's address in stack
    return b; //returning pointer to kek
};
当局部变量被“创建”时,编译器通过在堆栈[1]上给变量一些空间来实现。只要您在该函数中,该空间就可用于变量。当函数返回时,该空间将被释放,并可供其他函数使用。因此,第二个代码中的
b
地址将返回一个指向内存的指针,该指针将在返回结束后重新释放

尝试添加如下内容:

int foo()
{
     int x = 42;
     cout << "x = " << x << endl;
     return x;
}
intfoo()
{
int x=42;

cout首先,正如其他人所指出的,这肯定是不安全的。但根据您的使用情况,我认为您可能实际上正在尝试定义一个对象。例如,以下代码可能是您想要的:

struct topkek{
    int kek;
    int *operator()() {
        kek = 2;
        return &kek;
    }
};

int main()
{
    topkek mykek;

    int *a = mykek(); // sets mykek.kek to 2, returns pointer to kek

    std::cout << *a;
    *a = 3;
    std::cout << *a;
    std::cin >> *a;
};
struct-topkek{
int kek;
int*运算符(){
kek=2;
返回&kek;
}
};
int main()
{
托普克·米克;
int*a=mykek();//将mykek.kek设置为2,返回指向kek的指针
标准::cout*a;
};

这将使您能够完全安全地访问底层
kek
变量。当然,您可以将任何需要的代码放入
操作符()中
method.

不,这是指针最不安全的做法。不要这样做。一旦变量超出范围,它就会停止存在-如果你保留指向它的指针,你最终会遇到未定义的行为。谢谢。我以前用C#和高级语言编写。我认为这是错误的,但编译器对它没有问题,它工作正常。
int foo()
{
     int x = 42;
     cout << "x = " << x << endl;
     return x;
}
struct topkek{
    int kek;
    int *operator()() {
        kek = 2;
        return &kek;
    }
};

int main()
{
    topkek mykek;

    int *a = mykek(); // sets mykek.kek to 2, returns pointer to kek

    std::cout << *a;
    *a = 3;
    std::cout << *a;
    std::cin >> *a;
};