小弟是初学者对这个指针问题有点不解,程序编译没问题,运行是显示内存错误,请高手帮忙看看,错在哪里,在线等
#include <iostream>
using namespace std;
int foolbar(int *pi)
{
*pi = 1024;
return *pi;
}
int main()
{
int *pi2 = 0;
int vale = foolbar(&pi2);
return 0;
}
1。int vale = foolbar(&pi2);参数传递错误
2。*pi = 1024; pi未初始化就赋值
#include<iostream>
using namespace std;
int foolbar(int *pi)
{
pi = new int[1024]; //pi初始化
*pi = 1024;
return *pi;
}
int main()
{
int *pi2 = 0;
int vale = foolbar(pi2);//传递pi2
return 0;
}
我说名人,你可不要改变楼主的程序本意呀!!楼主应该是想通过传递指针来修改实参,而不是申请空间。而且你这种申请方法是错误的。
#include<iostream>
using namespace std;
int foolbar(int *pi)
{
pi = new int[1024]; //pi初始化
*pi = 1024;
return *pi;
}
int main()
{
int *pi2 = 0;//1. 指针初始化要用NULL,即:int *pi2 = NULL;
int vale = foolbar(pi2);//传递pi2 //2. 传递指针时,指针无法改变自身的 地址,所 以要用指针的指针作参数。
//3. 没有释放动态内存
return 0;
}
正确的两种申请空间的方法如下:
1。利用参数传递:
void GetMemory(int **pi)
{
*pi = new int[1024];
}
int main()
{
int *pi2 = NULL;
GetMemory(&pi2);
......
delete [] pi2;
return 0;
}
2。利用返回值:
int* GetMemory()
{
int *pi = new int[1024];
return pi;
}
int main()
{
int *pi2 = NULL;
pi2 = GetMemory();
......
delete [] pi2;
return 0;
}
[此贴子已经被作者于2006-3-7 10:20:20编辑过]
那么姑且认为楼主希望在foolbar()函数里给pi2指针赋值,并且返回所赋的值。不过,要提醒楼主,因为1024没有在堆上分配空间,所以出了foolbar函数,pi2所指的值就被程序销毁了,如果在程序最后打印一下*pi2的值,会发现,这是一个无意义的值。
下面这个程序,运行就没有内存错误了。但是pi2指针隐藏了很大的危险,指向是foolbar函数里的临时变量。
#include <iostream>
using namespace std;
int foolbar(int *&pi)
{
int i = 1024;
int *pTemp = &i;
pi = pTemp;
return *pi;
}
int main()
{
int *pi2 = 0;
int vale = foolbar(pi2);
cout << vale << endl;
cout << *pi2 << endl;
return 0;
}