【问题标题】:How to set value of struct indirectly in c?如何在c中间接设置结构的值?
【发布时间】:2020-12-10 08:31:48
【问题描述】:

我想知道,如何通过指针访问结构的第一个成员。我试过这个:

#include <stdio.h>
#include <stdlib.h>

struct foo
{
    int a;
    char *str;
};

int main()
{
    struct foo *p = malloc(sizeof(struct foo));
    int val = 10;
    *(int**)p = &val; //set the value of the first member of struct foo
    printf("%i\n",p->a);
}

但是打印一些垃圾。我怎样才能以类似的方式设置它?

【问题讨论】:

  • 我更好奇为什么你想做这样的事情?您需要解决的实际问题是什么?如果只是单纯的好奇也没关系,但请在问题正文中说明。

标签: c pointers struct double-pointer


【解决方案1】:

作业应该是:

*(int*)p = val;

您要分配给int 成员,因此指针必须是指向int 的指针,而不是指向int 的指针。并且分配的值必须是int&amp;val 是指向 int 的指针。

【讨论】:

  • 投反对票,因为演员阵容是不必要的,应该避免。
  • 为什么不需要演员表? p 的类型是 struct foo *,您不能使用它来仅分配给 int 成员。
  • 这是不必要的,因为它可以很容易地避免。请参阅我的答案。
  • 我将p 的定义作为给定的,问题是如何使用它来分配给成员。
  • @Someprogrammerdude 没有。强制转换为结构的初始成员,明确允许。
【解决方案2】:

您所做的是将p-&gt;a 的值设置为val 的地址(可能截断为32 位,具体取决于实现)。

要通过指针访问该字段,您必须获取该字段的地址,然后分配给取消引用的指针。

int *pa = &p->a;
*pa = val;

当然你也可以写p-&gt;a = val。请注意,p-&gt;a 只是 (*p).a 的缩写。

【讨论】:

  • 另外值得注意的是,*(int**)p 有效地将a 视为int* 而不是int,所以这种方式也是双重错误的。
  • 对,我完全错过了!
猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多