如何在C中使用指向指针的指针分配内存

use*_*872 2 c malloc pointers

我正在尝试以免费的双指针来理解代码片段

而 为什么要使用双指针?或者为什么使用指向指针的指针?

我想了解以下内容之间的区别。两个片段都来自上述网址

int** pt; 

pt = (int*) malloc(sizeof(int)*10);
Run Code Online (Sandbox Code Playgroud)

和

*pt = (int*) malloc(sizeof(int)*10);
Run Code Online (Sandbox Code Playgroud)

你能详细说明一些例子和绘图吗

Joh*_*ode 10

首先,代码片段不好有几个原因——第一个是将结果malloc转换为错误的类型,并且使用错误的类型来计算内存量。修复演员表和类型问题,我们有:

int **pt;

 pt = malloc( sizeof  *pt * 10 );   // allocate space for 10 int *
*pt = malloc( sizeof **pt * 10 );   // allocate space for 10 int
Run Code Online (Sandbox Code Playgroud)

执行第一行后,您将获得以下内容:

     int **                int *
    +---+                 +---+
pt: |   | --------------->|   | pt[0]
    +---+                 +---+       
                          |   | pt[1]
                          +---+
                          |   | pt[2]
                          +---+
                           ...
                          +---+
                          |   | pt[9]
                          +---+
Run Code Online (Sandbox Code Playgroud)

您已为 10 个int *对象留出空间,并pt指向其中的第一个。

下一行

*pt = malloc( sizeof **pt * 10 ); // allocate space for 10 int
Run Code Online (Sandbox Code Playgroud)

为 10 个int对象分配空间,并设置pt[0]指向它们:

     int **                int *                int 
    +---+                 +---+                +---+
pt: |   | --------------->|   | pt[0] -------->|   | pt[0][0]
    +---+                 +---+                +---+
                          |   | pt[1]          |   | pt[0][1]
                          +---+                +---+
                          |   | pt[2]          |   | pt[0][2]
                          +---+                +---+
                           ...                  ...
                          +---+                +---+
                          |   | pt[9]          |   | pt[0][9]
                          +---+                +---+
Run Code Online (Sandbox Code Playgroud)

这说明了一种分配“锯齿状”数组的方法;您仍然可以将其索引为pt[i][j],但与真正的二维数组不同的是,行在内存中并不相邻,并且每一行的长度可能不同。你通常会写成

pt = malloc( sizeof *pt * ROWS );
if ( pt )
{
  for ( size_t r = 0; r < ROWS; r++ )
  {
    pt[r] = malloc( sizeof *pt[r] * COLS );
  }
}
Run Code Online (Sandbox Code Playgroud)

当这一切都完成后,你有这样的事情:

     int **           int *                 int
    +---+            +---+                 +---+---+     +---+
pt: |   | ---------> |   | pt[0] --------> |   |   | ... |   | pt[0][0] - pt[0][COLS-1]
    +---+            +---+                 +---+---+     +---+
                     |   | pt[1] ------+
                     +---+             |   +---+---+     +---+
                     |   | pt[2] ---+  +-> |   |   | ... |   | pt[1][0] - pt[1][COLS-1]
                     +---+          |      +---+---+     +---+
                      ...           | 
                                    |      +---+---+     +---+
                                    +----> |   |   | ... |   | pt[2][0] - pt[2][COLS-1]
                                           +---+---+     +---+
Run Code Online (Sandbox Code Playgroud)