Turbo C++和GCC编译器在指针递增过程中产生不同的结果
Turbo C++ and GCC compiler produces different results during pointer incrementation?
下面的程序用于计算数组中浮点数的和。
我只是使用指针概念对其进行了修改,将数组"a"的基地址分配给指针变量"p",然后递增指针变量以计算数组的和。
int main()
{
float a[5],*p,sum=0.0;
int i;
for(i=0;i<5;i++)
{
cin>>a[i];
}
p=a;
for(i=0;*p!=' ';i++)
{
sum=sum+*p;
*p++;
}
cout<<sum;
return 0;
}
但是,当使用GCC编译器编译此程序时,数组的总和只会加倍。为什么会发生这种情况??
注意:此问题仅在GCC编译器中发生,Turbo C++会产生正确的结果。
编辑:正如你们所说的,不能保证p在数组末尾是0
,那么为什么一个编译器(TURBO C++)能够产生正确的结果,而另一个(GCC)只是将其加倍,而不是打印一些垃圾值。
这是错误的循环条件:*p!=' '
这相当于*p != 0.0f
,但您的阵列不会以这种方式终止。循环将运行太长,程序将试图访问超出数组边界的内容,这是一个错误。您需要i < 5
。这是循环的固定版本。
for (i = 0, p = a; i < 5; i++, p++) {
sum += *p;
}
任何时候代码中出现此类错误,都有可能根据编译器或设置的不同而出现不同的错误。
由于这是C++,您可以用这种方式编写数组:
for (auto item : a) {
sum += item;
}
这里的问题是假设p
指向一个数组,其中最后一个(结束)元素是0,就像c样式字符串一样。这个假设是错误的。不要求在数组的末尾有一个0。
您需要使用数组的大小或通过将指针与经过结束元素的指针进行比较来终止循环。
相关文章:
- 是否删除在对象构造过程中创建的对象
- 如何在鼠标挂钩过程中检测拖动
- clang 插件:在编译过程中修改 AST
- Adafruit 羽毛RFM69HCW在使用过程中会冻结,需要硬重置
- 线程过程中的线程同步问题
- MySQL 连接器/C++.尝试在此过程中停止连接到数据库
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- 在调用过程中删除 std::函数
- 动态矩阵特征分解过程中的误差
- cmake在构建过程中使用另一个工具检测标志
- 在模板参数推导过程中丢失限定符
- 升压过程中的管道缓冲区大小
- 如何在插入过程中更改插入的值
- 在PostgreSQL函数或过程中使用C++代码
- Vulkan:设备在缓冲区复制过程中丢失
- 如何解决导入dll过程中Viual Studio中的并排配置错误
- C++:如何在对象构造过程中调用初始值设定项列表之外的成员构造函数
- Node中的子节点列表在C++中的BFS遍历过程中丢失
- 在std::for_each的执行过程中累积结果,该异常被中断
- Turbo C++和GCC编译器在指针递增过程中产生不同的结果