c - 结构成员不通过指向结构的指针更新

标签 c pointers struct

我很难理解指向结构的指针,所以我写了一个带有一些打印语句的示例代码。

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/

相关文章:

c++ - 防止 Ctrl-C 关闭程序

c++ - 是否可以将地址映射到函数的结果?

c - 试图对结构中的数据进行排序,它排序正确但最后一行是错误的

c - 以色带为输入计算电阻值

arrays - 使用 map 或 slice 进行性能搜索

c++ - 是否可以将 GTK+ 与 C++ 一起使用?

java - 在执行 mmap 时,C 或 Java 会有明显的性能差异吗?

c - 无法分配指针 linux 接收到的内存

c# - 将指向结构的指针的 FieldOffset 设置为与固定字节数组相同的值

c - 如何将 1D char 转换为 2D int 数组并将其传递给 int C?