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

时间:2016-05-24 10:31:19

标签: 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 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);

2 个答案:

答案 0 :(得分:0)

指向像

这样的指针的情况
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

将完成这项工作。

答案 1 :(得分:0)

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

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

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

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

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