调试时我发现我的程序停在:“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;
}
}
答案 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;
}