版本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);
答案 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在定义二维数组时所做的事情。分配,初始化和使用比替代方案更快。