2013-11-24 28 views
1

以下代码细运行 -问题变为尺寸在C 2-d阵列++

void func(int m[][2]) 
{ 
    cout<<(m[0][0])<<endl; 
} 

int main() 
{ 
// int x=2; 
    int m[2][2]; 
    m[0][0] = m[0][1] = m[1][0] = m[1][1] = 5; 
    cout<<m[0][0]<<endl; 
    func(m); 
} 

但是,当我改变main()如下 -

int main() 
{ 
    int x=2; 
    int m[x][x]; 
    m[0][0] = m[0][1] = m[1][0] = m[1][1] = 5; 
    cout<<m[0][0]<<endl; 
    func(m); 
} 

我得到的错误消息 -

try.cpp:16:11: error: cannot convert ‘int (*)[(((long unsigned int)(((long int)x) + -0x00000000000000001)) + 1)]’ to ‘int (*)[2]’ for argument ‘1’ to ‘void func(int (*)[2])’

此外,以下运行良好 -

​​3210

任何人都可以在这里解释这个问题吗?谢谢。

+0

假设'gcc'然后[此](http://stackoverflow.com/questions/14548753/passing-a-multidimensional-variable-length-array-to-a-function)可以提供一个答案虽然这不是一个很好的。 –

+0

你的第二个也不是标准的C++。 – chris

+1

@chris true,但'gcc'和'clang'至少支持VLA作为扩展。 –

回答

1

变长数组在C++中无效。 g ++允许将其作为“扩展”。

int x=2; 
int m[x][x]; //Illegal in C++ 

你应该去动态内存分配,如果你要动态分配内存的数组。

int x=2; 
int *m = new int[x]; 

这是更好,如果你使用STL:

int x = 10; 
std::vector<int> m(n); 

或创建时,你可以使用常量不是变量

const int x=2;    //it's a compile time constant 
int m[x][x];   
+0

或者,您应该推荐OP使用[tag:C++] STL容器代替'raw'[tag:c]数组,以克服管理内存分配的所有障碍。 –

+0

是的。编辑帖子! – Shivam