我有几个直截了当的问题: -
根据普通的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);
}
如果数组的边界必须是一个常量表达式,为什么以下不会产生编译器错误?
int func(int m, int n)
{
int arr[m][n]; //m and n are not known until run time
}
答案 0 :(得分:2)
根据普通的c ++编译器,以下是否正确?
是的,因为标准规定甚至具有多于1维的数组在内存中是连续的。 但是!你误解了数组索引和长度 - i和j必须分别<3>严格<3>。 3和4是两个维度中数组的大小,不是最大可能的下标。
如果数组的边界必须是一个常量表达式,为什么以下不会产生编译器错误?
也许你正在使用支持这个作为扩展的编译器(想想GCC,Clang等)
答案 1 :(得分:1)
a
时,实际上是未定义的行为。否则,如果您正在使用正确计算数组索引(在边界内),那么它是有效的。
您可能正在使用variable length array的gcc扩展名。