我很难理解指向结构的指针,所以我写了一个带有一些打印语句的示例代码。
struct Student {
uint32_t id;
uint8_t marks[8];
int32_t credit;
};
struct Student jacob;
struct Student *adam = &jacob;
struct Student mary = *adam;
mary.marks[3] = 80;
jacob.marks[3] = 75;
adam->marks[3] = 67;
printf("jacob: %d\n", jacob);
printf("&jacob: %d\n", &jacob);
printf("adam: %d\n", adam);
printf("*adam: %d\n", *adam);
printf("mary: %d\n", mary);
printf("mary.marks[3]: %d\n", mary.marks[3]);
输出是:
jacob: 4195856
&jacob: -436012784
adam: -436012784
*adam: 4195856
mary: 4195856
mary.marks[3]: 80
为什么 mary.marks[3]
的值为 80?据我了解,mary
间接指向 struct jacob
,因为 adam
指向 jacob
的地址。因此 adam->marks[3] = 67
行将更改 mary.marks[3]
的值,因为它们指向相同的位置。
有人可以帮我理解为什么 mary.marks[3]
的值保持不变吗?
最佳答案
简单地说,语句 struct Student jacob;
为学生结构的一个副本创建空间(在堆栈上或在内存中,具体取决于答案,但与答案无关)。
语句 struct Student *adam = &jacob;
使 adam 成为指向 jacob 的指针。
语句 struct Student mary = *adam;
将未初始化的数据从 adam 指向 (jacob) 的地方复制到为 mary 分配的新空间。
了解 jacob 和 mary 分配了空间很重要。 adam 是指向 jacob 的指针。但是,当您说 mary.marks[3]=80 时,您是在为“mary”赋值,而“jacob”没有变化。
然后您写入 jacob.marks[3]
,然后使用 adam->marks[3]
覆盖它。
当你 printf 一个地址时,你应该使用 %p。当你用 %d 打印一个结构时,C 只是愚蠢地看着内存,“好像”它是一个整数。在你说 struct Student mary = *adam;
的行中,你正在将包含 jacob 的(尚未初始化的)内存复制到新分配的 mary 内存中。这就是 printf 相同的原因。如果你 printf &mary,你会发现它和 jacob 或 adam 不是同一个内存。
关于c - 结构成员不通过指向结构的指针更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41917838/