以下是p[10][10]数组的内存分配方法.
//First
char** p;
int i;
p=(char**)malloc(10*sizeof(char*));
for(i=0;i<10;i++)
p[i]=(char*)malloc(10*sizeof(char));
//Second
char** p;
int i;
p=(char**)malloc(10*sizeof(char*));
*p=(char*)malloc(100*sizeof(char));
for(i=1;i<10;i++)
p[i]=p[0]+10*i;
Run Code Online (Sandbox Code Playgroud)
两者有什么区别?
这些都不是C++.第一个分配一个10的数组char*,然后将每个数组分配给一个单独的动态分配的10个数组char.10每个阵列都是独立的,所以你必须为差异是什么之间没有保证p[0][9]和p[1][0]:
p
+------+
| p[0] | --> [][][][][][][][][][]
+------+
| p[1] | --> [][][][][][][][][][]
+------+
| | --> [][][][][][][][][][]
+------+
...
+------+
| p[9] | --> [][][][][][][][][][]
+------+
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,你有一个连续的100个数组char,你的10 char*个指向不同的段:
0 1 2 10 20
+--+--+--+ +--+ +--+
| | | |...| |...| |... <== dynamically allocated array of 100 char
+--+--+--+ +--+ +--+
| / /
\ / /
+------+------+------+
p | p[0] | p[1] | p[2] |... <== dynamically allocated array of 10 char*
+------+------+------+
Run Code Online (Sandbox Code Playgroud)
在这里,你确实有保证,未来char后p[0][9]是p[1][0].
虽然这些都不是真正的阵列.要做到这一点,你需要:
char p[10][10];
Run Code Online (Sandbox Code Playgroud)
这将给出第二个块的等效行为 - 减去10 char*秒的所有额外开销和动态内存分配.在C++中,我们更愿意将其编写为:
std::array<std::array<char, 10>, 10> p;
Run Code Online (Sandbox Code Playgroud)