取消引用这个指针有什么问题?
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;
}
调试时我发现我的程序停止在:"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;
}