[英]pointers arithmetics not working in c++
我曾经在C语言中使用指针算术,但是,我刚开始学习c语言中的new
和delete
,我不明白为什么在C ++中增加指针时为什么会出现运行时错误
使用p ++或++ p时出现以下错误...
free(): invalid pointer: 0x0000000002324c24 ***0x2324c240x2324c28Aborted (core dumped)
#include<iostream>
using namespace std;
int main()
{
int *p;
p=new int[4];
*p=34;
*(p+1)=36;
cout<<++p;//doesnot work(I just wanted to print the address)
cout<<p+1;//works
delete[] p;
return 0;
}
您需要delete[]
原始指针,这是由于new[]
。 然后您松开了原始指针,因为您执行++p
。
当您执行delete[] p
时,这导致未定义的行为 。
您需要对new
返回的值使用delete
。 在您的代码中,情况并非如++p
。
这是因为new / delete使用p
查找您不了解的客房信息。 当您为p
传递无效值时,会感到困惑。
这与C和C ++之间的差异无关。 这仅仅是给delete[]
一个不是new[]
产生的指针值,而在C语言中,通过free
一个不是malloc
或calloc
产生的指针值,也会遇到同样的问题。 该代码使用的指针值是通过递增原始值而产生的; 改用原版。
有这方面的C和C ++之间的差异,虽然。 即,在C ++中, ++
运算符的应用程序始终是一个左值表达式,而在C中,前缀++
的结果是“操作数后的新值”。 但是,语义上的这种差异与您的代码无关。
C ++ 11§5.3.2/ 1”前缀
++
运算符的操作数的值增加。 结果是递增后操作数的新值。 表达式++E
等效于(E+=1)
。
”前缀
++
的操作数通过加1进行修改,如果为bool
则将其设置为true
(不建议使用此用法)。 操作数应为可修改的左值。 操作数的类型应为算术类型或指向完全定义的对象类型的指针。 结果是更新的操作数; 它是一个左值,如果操作数是一个位字段,则它是一个位字段。 如果x
不是bool
类型,则表达式++x
等效于x+=1
可以考虑使用std::vector
,而不是通过诸如new int[4]
表达式创建动态数组。 它使内存管理自动化,这意味着您可以避免很多问题,包括此问题中的一个。 它提供了许多方便的功能,并且经过了充分的测试和可靠的测试,这意味着更少的工作量和更高的生产率。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.