解除引用此指针有什么问题?

时间:2015-02-11 05:04:43

标签: 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;
    }
}

4 个答案:

答案 0 :(得分:8)

您使用零

初始化指针
int *ptr = 0;

表示它是一个空指针。

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

请注意

void myfun();
main中的

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

myfun();

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

答案 1 :(得分:0)

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

虽然你让ptr porint到数组x,但是当myfun()完成并返回x的内存时已经被破坏了。所以在main函数中,ptr变为wild指针,你的程序会崩溃。

您应该知道,当局部变量不在其范围内时,它们将被存档。

答案 2 :(得分:0)

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);  
}

答案 3 :(得分:0)

按照上面的答案和一点点的谷歌搜索后,我找到了问题的确切解决方案:从函数返回可变大小的数组。

这是代码:

#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;
}