数组声明和寻址

问题描述 投票:0回答:2

我有几个简单的问题:-

  1. 根据普通的 C++ 编译器,以下内容正确吗?

    int arr[3][4];
    void func(int *a, int m, int n)
    {
     int i,j;
     cin>>i>>j; 
     cout<< a[i*n + j]; //is this way of addressing correct provided 0<=i<m and 0<=j<n
    } 
    
    int main()
    {
     func((int*)arr, 3,4);
    }
    
  2. 如果数组的边界严格必须是常量表达式,为什么下面的代码不会生成编译器错误?

    int func(int m, int n)
    {
     int arr[m][n]; //m and n are not known until run time
    }
    
c++ compiler-errors
2个回答
2
投票

根据普通的 C++ 编译器,以下内容正确吗?

是的,因为标准规定,即使维度超过 1 的数组在内存中也是连续的。 但是! 您有点误解了数组索引和长度 - i 和 j 必须分别“严格小于”3 和 4。 3 和 4 是二维数组的大小,不是最大可能的下标。

如果数组的边界严格必须是常量表达式,为什么下面的代码不会生成编译器错误?

也许您正在使用支持此扩展的编译器(例如 GCC、Clang 等)


1
投票
未定义的行为

。否则,如果您正确计算数组索引(在范围内),那么它是有效的。 在您的情况下,您可能会使用 gcc 扩展来实现

可变长度数组

© www.soinside.com 2019 - 2024. All rights reserved.