我在其中一门课上学习C语言。在我的一个实验室中,我们需要使用一组结构。
我的一个实验室TA告诉我,我应该使用这样的数组:
typedef struct person {
int age;
char *name;
} Person;
int main() {
Person **people = (Person **)malloc(sizeof(Person *));
Person *personA = (Person *)malloc(sizeof(Person));
personA->age = 18;
personA->name = "LeBron James";
Person *personB = (Person *)malloc(sizeof(Person));
personB->age = 20;
personB->name = "Kobe Bryant";
Person *personC = (Person *)malloc(sizeof(Person));
personC->age = 21;
personC->name = "Michael Jordan";
people[0] = personA;
people[1] = personB;
people[2] = personC;
printf("Name of first person is %s \n", people[0]->name);
printf("Name of second person is %s \n", people[1]->name);
printf("Name of second person is %s \n", people[2]->name);
结果是对的。但是我不明白为什么指向指针(people
)的指针可以像数组一样? (例如people[0] = personA
)
有人可以向我解释一下吗?
答案 0 :(得分:3)
它有效,因为它基本上是语法糖。 ANSI标准定义它:
下标运算符[]的定义是E1 [E2]与(*(E1 +(E2)))相同
因此,您可以使用取消引用运算符*a
查看地址中的特定元素,或使用a[b]
运算符查看b
的{{1}}元素。
正如其他人已经指出的那样,你的示例代码非常错误。
答案 1 :(得分:1)
Person **people = (Person **)malloc(sizeof(Person *));
应该是
Person **people = (Person **)malloc(sizeof(Person *) * 3);
否则当你这样做时
people[0] = personA;
people[1] = personB;
people[2] = personC;
您编写的8字节数据(假设为32位)超出了分配的范围。
你可以使用像数组这样的指针的原因是因为它们或多或少是相同的,特别是在直接C中。
例如:
int* numberlist = malloc(sizeof(int) * 10)
和
int numberlist[10];
可以通过相同的方式访问。唯一的区别是如何分配内存。