V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
catbaron
V2EX  ›  问与答

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

  •  
  •   catbaron · 2014-11-20 16:39:47 +08:00 · 4288 次点击
    这是一个创建于 3662 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码如下。
    大概说一下,内容很简单。
    声明了两个二维数组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;
    }
    8 条回复    2014-11-20 19:35:09 +08:00
    churchmice
        1
    churchmice  
       2014-11-20 16:47:32 +08:00 via Android
    因为B在栈顶,N+1行其实是越界了,被其他程序改掉了
    sharebox
        2
    sharebox  
       2014-11-20 16:53:20 +08:00
    下标从0开始?
    cvrock
        3
    cvrock  
       2014-11-20 17:29:11 +08:00
    你打印的是A[height][i]和B[height][i]的值,此时height为10,显然越界了,你应该是指A[height - 1][i]吧。
    proudzhu
        4
    proudzhu  
       2014-11-20 18:32:32 +08:00 via iPhone
    都越界了,你想出现什么结果?可以去看一下生成的汇编代码
    acros
        5
    acros  
       2014-11-20 18:35:49 +08:00
    这个是c系语言的基本常识哎····
    如果真要问数组有哪些坑,可以看看《C专家编程》那本书。数组问题讲了很多,不过看那本书之前得有计算机原理和体系结构方面的知识打底。
    kamen
        6
    kamen  
       2014-11-20 18:50:50 +08:00
    数组的问题不用看都是越界
    catbaron
        7
    catbaron  
    OP
       2014-11-20 19:25:43 +08:00
    @kamen
    @acros
    @proudzhu
    @cvrock
    @sharebox
    @churchmice

    感谢各位回复,请无视我这个SB的问题吧就是脑子抽了= =。
    FrankHB
        8
    FrankHB  
       2014-11-20 19:35:09 +08:00   ❤️ 1
    给数组赋值有什么坑?如果按标题字面回答,没有:因为C++的(内建)数组表达式根本就不支持被赋值。
    下标从0开始,越界什么的有说了就不多讲了。
    要愉快地折腾内建数组,你至少还得知道那么几件事:
    为什么不推荐/避免用数组;
    所谓的数组本义是指类型;
    内建[]的语义;
    array-to-pointer conversion;
    one past the last element的特殊性;
    怎么初始化。
    至于看汇编什么的,现阶段请一概无视。我的经验表明对天赋点在正负两个标准差内的人群得到正确的理解没有什么好处。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2417 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 01:01 · PVG 09:01 · LAX 17:01 · JFK 20:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.