-1

版本 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);
4

2 回答 2

0

在指向指针的情况下

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

您必须首先为argv自己分配内存,然后为argv[i]s.

类似的东西(代码没有错误检查

  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

将完成这项工作。

于 2016-05-24T10:33:34.247 回答
0

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

如果您的意思是您输入的内容,即 - 一个非(编译时间)已知大小的指针数组,指向非编译时间已知大小的字符数组,那么您将需要这样做。为指针数组分配存储空间,将其放在您argv的 .

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

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

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

于 2016-05-24T10:42:42.433 回答