| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 807 人关注过本帖
标题:一个简单的指针问题
只看楼主 加入收藏
spirithk
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-3-6
收藏
 问题点数:0 回复次数:11 
一个简单的指针问题

小弟是初学者对这个指针问题有点不解,程序编译没问题,运行是显示内存错误,请高手帮忙看看,错在哪里,在线等
#include <iostream>
using namespace std;

int foolbar(int *pi)
{
*pi = 1024;
return *pi;

}
int main()
{
int *pi2 = 0;
int vale = foolbar(&pi2);

return 0;
}

搜索更多相关主题的帖子: 指针 
2006-03-06 20:16
wanglff
Rank: 2
等 级:新手上路
威 望:5
帖 子:375
专家分:0
注 册:2005-12-21
收藏
得分:0 
int *pi2 = 0;
int vale = foolbar(&pi2);//用foolbar(pi2)//对不起啊搞错了是pi2而不是*ip2

实参的类型要和形参的类型一样

[此贴子已经被作者于2006-3-7 9:17:31编辑过]


自强不息:)
2006-03-06 21:07
西部天狼
Rank: 1
等 级:新手上路
帖 子:95
专家分:0
注 册:2006-2-23
收藏
得分:0 

int foolbar(int *pi)
要求传入的是一个指针
pi2是一个指针,&pi2则是一个指向指针的指针
所在用&pi2调用函数时将会出现类型不一致的编译错误,编译是不会通过的


学习-->编程-->交流-->再学习-->再编程-->再交流
2006-03-07 00:28
名人
Rank: 1
等 级:新手上路
威 望:1
帖 子:205
专家分:0
注 册:2006-3-3
收藏
得分: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;
}


未必钱多乐便多,财多累己招烦恼。 清贫乐道真自在,无牵无挂乐逍遥。
2006-03-07 09:52
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
得分:0 
以下是引用名人在2006-3-7 9:52:00的发言:

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编辑过]


谷底深深行 ,峰顶漫漫步......@_@
2006-03-07 10:18
名人
Rank: 1
等 级:新手上路
威 望:1
帖 子:205
专家分:0
注 册:2006-3-3
收藏
得分:0 

olivezhang:
你说的那些都没错。但是
1
.指针初始化要用NULL 用0也可以,你可以去看看stdio.h的定义#define NULL 0

2。vale的确不是指针类型,但是楼主的foolbar函数返回的并不是内存地址
3。指针可以指向其他地址,那要看楼主的意图是什么。如果楼主意图通过传递指针来修改实参,那么可以按引用传递不必要使用指针的指针

4.使用delete释放内存(OK)


未必钱多乐便多,财多累己招烦恼。 清贫乐道真自在,无牵无挂乐逍遥。
2006-03-07 10:46
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
我不知道楼主想要干什么,给pi2这个指针赋值么?那为什么函数foolbar()的返回值是int?

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-03-07 11:01
名人
Rank: 1
等 级:新手上路
威 望:1
帖 子:205
专家分:0
注 册:2006-3-3
收藏
得分:0 

#include<iostream>
using namespace std;

int foolbar(int &pi)
{
pi = 1024;
return pi;
}
int main()
{
int *pi2 = NULL;
int vale = foolbar((int &)pi2);

cout<<"pi2 = "<<(int)pi2<<"\n"<<"vale = "<<vale<<endl;
return 0;
}


未必钱多乐便多,财多累己招烦恼。 清贫乐道真自在,无牵无挂乐逍遥。
2006-03-07 11:10
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
得分:0 
名人兄:
1。用0自然不会出错,用NULL更符合编程规范罢了:)
2。传递指针的指针是为了申请内存的。
3。修改实参,指针、引用都可,没有问题。
4。楼主的问题应该已经解决了。

谷底深深行 ,峰顶漫漫步......@_@
2006-03-07 11:10
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 

那么姑且认为楼主希望在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;
}


成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-03-07 11:11
快速回复:一个简单的指针问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017310 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved