取消引用这个指针有什么问题?

What is wrong with derefrencing this pointer?

调试时我发现我的程序停止在:"cout << *ptr ; cout << "\n";"这段代码有什么问题?

#include<iostream>

using namespace std;
int *ptr = 0;
void myfun(void);

int main()
{
    void myfun();
    for(int j = 1; j < 3; j++)
    {
        ptr = ptr-j ;       
        cout << *ptr ; cout << "\n";

    }
    return(0);  
}

void myfun(void)
{
    int x[3] = {11,12,13};
    for(int i = 0; i <3; i++)
    {
        ptr = &x[i];
        ptr = ptr+1;
    }
}

你用零初始化了你的指针

int *ptr = 0;

这意味着它是一个空指针。

那么你正在将指针算法应用于空指针。行为未定义。您正在取消引用以这种方式获得的无意义的指针。行为未定义。

注意

void myfun();

in main不是函数调用,是函数声明。对 myfun 的调用(这显然是您的意图)如下所示

myfun();

你为什么把 void 放在你的代码版本中?

你的变量 ptr 是一个野指针。

虽然你让ptr 指向数组x,但是当myfun() 完成并且returnx 的内存已经被销毁。所以在main函数中,ptr变成了野指针,你的程序就会崩溃。

你应该知道,当局部变量不在它们的范围内时,它们将被销毁。

main 函数无法访问数据,因为数组 x[3] 的范围是 myfun(void)。 myfun 调用后(应该是 myfun(); 而不是 void myfun();),ptr 将指向一个未分配的内存位置。

要在main函数中打印数据,可以将int x[3]声明为全局变量。

int *ptr = 0;
void myfun(void);

int x[3] = {11,12,13};

int main()
{
    int *temp_ptr;
    myfun();
    temp_ptr = ptr;
    for(int j = 1; j <= 3; j++)
    {
        temp_ptr = ptr-j ;       
        cout << *temp_ptr ; cout << "\n";

    }
    return(0);  
}

在遵循上述答案并进行了一些谷歌搜索后,我找到了解决我的问题的确切方法:从函数 return 可变大小的数组。

这是代码:

#include<iostream>

using namespace std;
int * myfun(void);

int main()
{
    int *ptr;
    ptr = myfun();
    int len = (sizeof(ptr)/sizeof(*ptr));
    for(int j = 0; j <= len; j++)
    {
        cout << ptr[j];
    }
    return(0);  
}
int * myfun()
{
    static int x[3] = {11,12,13};
    return x;
}