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

C 如何使用双指针作为指针数组?,c,pointers,dynamic-memory-allocation,pointer-to-pointer,C,Pointers,Dynamic Memory Allocation,Pointer To Pointer,第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

第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个用于我机器中的整数)

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

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

在指针指向指针的情况下,如

struct mydef_s2 {
    int argc;
    char **argv;
};  
您必须首先为
argv
本身分配内存,然后为
argv[i]
s分配内存

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

argv=malloc(n*sizeof*argv)//分配内存以保存“argv[i]”的“n”个数
对于(i=0;i

将完成此任务。

C中的指针的行为有点像数组。然而,指向指针的指针与二维数组完全不同

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

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

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


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

你的意思是
p1->argv[2]=malloc(24)?看起来是个糟糕的主意。你怎么知道数组中每个条目分配的块有多长?可能是XY问题。你到底想达到什么目的?@sniper:注意,这与你问题中的方法不同,后者对每个指针使用大小不同的块。如果您确实需要一个恒定的大小,请改用2D数组。只需一次调用即可分配/释放。否则,您必须跟踪每个块的大小。带有灵活数组成员的
struct
将派上用场。如果所有行的大小相同,则2D数组是更好的方法。但为什么要限制它用于编译时大小?只需使用VLA,例如
char(*)[len_var]
struct mydef_s2 {
    int argc;
    char **argv;
};  
  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