关于指针自增运算的问题

water0313 2013-06-20 10:13:31
写了一个求阶乘的程序,使用了指针变量,但是在VS2008中运行时,指针的自增运算会产生中断错误,不知道哪里考虑欠缺,就把程序贴出来,让大家帮忙找找
#include <iostream>
using namespace std;
void main()
{
int x=1;
long * p = new long [16];
*p = 1;
for (x;x<16;x++)
{
p[x]=(p[x-1])* x;
}
x=0;
for (x;x<16;x++)
{
cout<<*p<<endl;
p++;
}
delete [] p;

}
...全文
93 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifeisshortyouneed 2013-06-21
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
int main()
{
 	int x=1;
 	long * p = new long [16];
 	*p = 1;
 	for (x;x<16;x++)
 	{
		p[x]=p[x-1]* x;
 	}
 	x=0;
 	for (x;x<16;x++)
 	{
 		cout<<p[x]<<endl;//问题应该在这里,x=15的时候,P已经指向了申请的最一个地址了,
//就是说最后一次循环的p++ 使P越界,其实像我这样改一下输出就行了,没有必要让p自增了。
 	}
 	delete [] p;
 	return 0;
}
starytx 2013-06-21
  • 打赏
  • 举报
回复
应该没有越界,只是因为p自增后指向改变,所以delete就错了,保存原始指针,delete原始指针即可
water0313 2013-06-21
  • 打赏
  • 举报
回复
引用 6 楼 ganpengjin1 的回复:
所以越界了导致的,更别提后面的delete了
我认为p[x]=(p[x-1])* x表达式中,p没有发生变化,只是指向的值发生变化,越界是由第二个for循环中的p++导致的,而且我的猜测已经测试过了。 很感谢你能提到这一点,让我对指针的认识加深了
漫步者、 2013-06-20
  • 打赏
  • 举报
回复
所以越界了导致的,更别提后面的delete了
water0313 2013-06-20
  • 打赏
  • 举报
回复
引用 3 楼 ganpengjin1 的回复:
p[x]=(p[x-1])* x; 这句等价于*(p+x)=*(p+x-1)*x;其实每次在原来的基础上移动x个单元,这样导致 cout<<*p<<endl; p++; 越界了。
如果是这样的话,它为什么还能显示正确的结果,但是运行结束后才弹出错误框呢
water0313 2013-06-20
  • 打赏
  • 举报
回复
引用 1 楼 rocktyt2 的回复:
你需要用一个指针保存一开始申请的内存空间,并用这个地址来delete p已经移掉了是没法delete成功的
恍然大悟啊
漫步者、 2013-06-20
  • 打赏
  • 举报
回复
p[x]=(p[x-1])* x; 这句等价于*(p+x)=*(p+x-1)*x;其实每次在原来的基础上移动x个单元,这样导致 cout<<*p<<endl; p++; 越界了。
water0313 2013-06-20
  • 打赏
  • 举报
回复
恍然大悟啊
rocktyt 2013-06-20
  • 打赏
  • 举报
回复
你需要用一个指针保存一开始申请的内存空间,并用这个地址来delete p已经移掉了是没法delete成功的

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧