这两种内存分配方法有什么区别?

pra*_*nam 4 c pointers

以下是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)

两者有什么区别?

Bar*_*rry 9

这些都不是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)

在这里,你确实有保证,未来charp[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)