derefrencing这个指针有什么问题?

exp*_*rer 0 c++ pointers

调试时我发现我的程序停在:"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;
    }
}
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 8

你用零初始化你的指针

int *ptr = 0;
Run Code Online (Sandbox Code Playgroud)

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

然后,您将指针算法应用于空指针.行为未定义.您正在取消引用以这种方式获得的无意义指针.行为未定义.

注意

void myfun();
Run Code Online (Sandbox Code Playgroud)

in main不是函数调用,它是函数声明.对myfun(显然是你的意图)的调用看起来如下

myfun();
Run Code Online (Sandbox Code Playgroud)

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

  • 无论如何,myfun将指针设置为指向堆栈上的一个位置,一旦myfun退出就会变为无效.此外,循环的最后一次迭代将指针设置为超出数组末尾的位置,这也是未定义的.然后main函数从指针中减去总共6个,这导致现在无效数组开始之前的位置.这段代码有太多问题,甚至无法想象正确的版本应该是什么. (3认同)