none
【新手】关于数组元素个数的问题 RRS feed

  • 问题

  • # include<iostream>
    using namespace std;
    void A(int a[], int b)
    {
        for(int n=0; n<b; n++)
            cout<<a[n]<<","<<endl;
    }

    int main()
    {
        int x[]={5,10,15}, y[]={2,4,6,8,10,12};
        A(x,4);//疑问,这里的4大于x[]的元素个数,结果输出了y[]的元素,为什么呢?
        A(y,3);
        return 0;
    }

    实际输出结果如下:

    5,

    10,

    15,

    2,

    2,

    4,

    6,

    2015年10月26日 3:24

答案

  • 这个问题就和C中如何对数组分配内存空间有关。因为C中数组是连续分配,且这里的x , y只是数组的一个指针,因为数组并没有明显的结束符,而且你的循环也没有检测数组是否结束。所以,当第一个x数组循环结束后,他就会去读取x数组所在空间的下一个位置的值,况且,你的代码运行时,分配的紧挨着x空间的内容是y数组,所以他就输出了y数组的第一个元素。

    下面是我这里的输出结果。

    5,10,15,-858993460,2,4,6

    因为我的环境下x,y数组没有连续分配,所以读完x数组后,他所读到的就是一个未知的值。

    一个比较好的方法去看你的数组分配情况,打开VS的调试〉窗口〉内存1

    然后在地址输入框中输入你的数组 x,回车。你就可以看到x数组所在内存的情况了。


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。


    • 已编辑 Jie Bao 2015年10月26日 3:51
    • 已建议为答案 Jie Bao 2015年10月26日 3:52
    • 已标记为答案 May Wang - MSFT 2015年11月3日 9:38
    2015年10月26日 3:49

全部回复

  • 这个问题就和C中如何对数组分配内存空间有关。因为C中数组是连续分配,且这里的x , y只是数组的一个指针,因为数组并没有明显的结束符,而且你的循环也没有检测数组是否结束。所以,当第一个x数组循环结束后,他就会去读取x数组所在空间的下一个位置的值,况且,你的代码运行时,分配的紧挨着x空间的内容是y数组,所以他就输出了y数组的第一个元素。

    下面是我这里的输出结果。

    5,10,15,-858993460,2,4,6

    因为我的环境下x,y数组没有连续分配,所以读完x数组后,他所读到的就是一个未知的值。

    一个比较好的方法去看你的数组分配情况,打开VS的调试〉窗口〉内存1

    然后在地址输入框中输入你的数组 x,回车。你就可以看到x数组所在内存的情况了。


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。


    • 已编辑 Jie Bao 2015年10月26日 3:51
    • 已建议为答案 Jie Bao 2015年10月26日 3:52
    • 已标记为答案 May Wang - MSFT 2015年11月3日 9:38
    2015年10月26日 3:49
  • 大概明白了,非常感谢你的解答。
    2015年10月26日 3:56