C++给数组赋值有什么坑么?

2014-11-20 16:39:47 +08:00
 catbaron
代码如下。
大概说一下,内容很简单。
声明了两个二维数组A、B,都是[n][m]维。
1. 打印第n+1行的内容,可以看到A都是随机数,正常;B的n+1行却是0。
2. 给二维数组正常赋值之后,再打印n+1行的内容,发现有B的n+1行也被赋值了。
是我哪里写的不对么?求指教

#include <iostream>
using namespace std;

int main(int argc, const char * argv[]) {
const int width = 10;
const int height = 10;
int A[height][width];
int B[height][width];
//赋值之前的n+1
for (int i = 0; i<width; i++) {
cout << "A1[height][" << i << "]:" << A[height][i] << endl;
}
for (int i = 0; i<width; i++) {
cout << "B1[height][" << i << "]:" << B[height][i] << endl;
}
//赋值
for (int i =0; i < height; i++) {
for (int j = 0;j < width; j++) {
A[i][j] = -1;
}
}
for (int i =0; i < height; i++) {
for (int j = 0;j < width; j++) {
B[i][j] = -1;
}
}
//赋值之后的n+1
for (int i = 0; i<width; i++) {
cout << "A2[height][" << i << "]:" << A[height][i] << endl;
}
for (int i = 0; i<width; i++) {
cout << "B2[height][" << i << "]:" << B[height][i] << endl;
}

return 0;
}
4307 次点击
所在节点    问与答
8 条回复
churchmice
2014-11-20 16:47:32 +08:00
因为B在栈顶,N+1行其实是越界了,被其他程序改掉了
sharebox
2014-11-20 16:53:20 +08:00
下标从0开始?
cvrock
2014-11-20 17:29:11 +08:00
你打印的是A[height][i]和B[height][i]的值,此时height为10,显然越界了,你应该是指A[height - 1][i]吧。
proudzhu
2014-11-20 18:32:32 +08:00
都越界了,你想出现什么结果?可以去看一下生成的汇编代码
acros
2014-11-20 18:35:49 +08:00
这个是c系语言的基本常识哎····
如果真要问数组有哪些坑,可以看看《C专家编程》那本书。数组问题讲了很多,不过看那本书之前得有计算机原理和体系结构方面的知识打底。
kamen
2014-11-20 18:50:50 +08:00
数组的问题不用看都是越界
catbaron
2014-11-20 19:25:43 +08:00
@kamen
@acros
@proudzhu
@cvrock
@sharebox
@churchmice

感谢各位回复,请无视我这个SB的问题吧就是脑子抽了= =。
FrankHB
2014-11-20 19:35:09 +08:00
给数组赋值有什么坑?如果按标题字面回答,没有:因为C++的(内建)数组表达式根本就不支持被赋值。
下标从0开始,越界什么的有说了就不多讲了。
要愉快地折腾内建数组,你至少还得知道那么几件事:
为什么不推荐/避免用数组;
所谓的数组本义是指类型;
内建[]的语义;
array-to-pointer conversion;
one past the last element的特殊性;
怎么初始化。
至于看汇编什么的,现阶段请一概无视。我的经验表明对天赋点在正负两个标准差内的人群得到正确的理解没有什么好处。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/148041

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX