如何使用双指针作为指针数组?

How to use double pointer as pointer arrays?

版本 1:

struct mydef_s1 {
    int argc;
    char *argv[3];
};          

struct mydef_s1   *p1 = (struct mydef_s1*) malloc (sizeof (struct mydef_s1));     
p1->argv[0] = malloc (8);
p1->argv[1] = malloc (16);
p1->argv[2] = malloc (24);

Now, I want to achieve above with the following structure declaration?

版本 2:

struct mydef_s2 {
    int argc;
    char **argv;
};  

如果我是对的,那么下面只想分配 8 个字节(在我的机器中 4 个用于内存指针,4 个用于整数)

struct mydef_s2   *p2 = (struct mydef_s2*) malloc (sizeof (struct mydef_s2));

我应该怎么做才能做到以下几点?

p2->argv[0]= malloc(4);
p2->argv[1]=malloc(8);

在指针指向like

的情况下
struct mydef_s2 {
    int argc;
    char **argv;
};  

您必须先为 argv 本身分配内存,然后再为 argv[i] 分配内存。

类似于(代码没有错误检查

  argv = malloc(n * sizeof*argv);  //allocate memory to hold 'n' number of 'argv[i]'s
  for (i = 0; i < n; i++)
       argv[i] = malloc(32);    //allocate individual `argv[i]`s

会完成任务的。

C 中的指针表现得有点像数组。但是,指向指针的指针与二维数组完全不同。

如果您的意思是您键入的内容,即 - 一个非(编译时间)已知大小的指针数组,指向非编译时间已知大小的字符数组,那么您将需要这样做。为指针数组分配存储空间,将其放在 argv 中,然后使用实际字符数组的指针(可能使用 malloc 动态分配)初始化那里的每个位置。

另一方面,如果您指的是二维数组,则有两种方法可以继续。一种是执行上述操作,可能通过一次性在一个 malloc 中分配内部嵌套来节省一步。这有点浪费内存。

另一个选项是模拟编译器对二维数组的处理。将n*m个字符分配为一维数组,通过公式i = r*m + c跳入其中,其中r为行索引,m为行大小,c 是列索引。

虽然有些冗长,但这是 C 在定义二维数组时所做的。它的分配、初始化和使用也比替代方案更快。