char**
和char[x][y]
是根本不同的,不能被施放。
当你做char array[100][100]
时,编译器会在一个地方分配所有东西,根本没有指针。它相当于太:
typedef char innerArray[100]; innerArray mm[100];
所以这是每100个字符的100块。 sizeof(mm)
将是一个10,000字节,并且您将有更好的运气投掷mm到char*
比char**
。但是,如果您使用char**
动态分配数组数组,则您有一个指向连续指针数组的指针;这些指针指向内存中任意长度的任意位置。 (这也让你有锯齿阵列。)这两种内存布局真的完全不同。现在
,你可能会被诱惑,只是使用相同类型的参数声明:
char mm[100][100];
void writeMatrixOut(char mm[100][100]);
但因为C甚至使问题更加混乱,这不是安全的。 foo(int x[3])
,foo(int x[])
和foo(int *x)
都是等同的。我不确定这是如何与嵌套数组一起工作的,但是当你传递一个参数时,编译器不会检查至少一个数组维度。
你可以用一个typedef避免这种情况:
typedef char Matrix[100][100];
Matrix mm;
void writeMatrixOut(Matrix &mm); // might even be 'const Matrix &'
但即便如此,你不能指定或返回数组。为了使阵列时,您必须包装他们在一个结构或类:
struct Matrix { char elements[100][100]; }
Matrix mm;
void writeMatrixOut(Matrix &mm); // might even be 'const Matrix &'
C++ 03/C++ 11还包含一个数组<>包装类,可以为你做到这一点,但它是用嵌套数组有点笨拙:
// namespace std::tr1:: in C++03, std:: in C++11
typedef array<100, array<100, char>> Matrix;
你可以像这样'char mm [] [640]''声明参数。这也是可能的 – Yappie
Yappie的评论说明了为什么这不是一个类型安全的方式来声明这个论点。如果你想要一些更安全的类型,你可以使用'void WriteMatrixOut(char(&mm)[480] [640]);'这是一个具有这些尺寸的数组的引用,编译器会在调用函数时检查它。 – 2011-12-04 00:49:57