c에서 struct의 값을 간접적으로 설정하는 방법은 무엇입니까?

Aug 20 2020

포인터를 통해 struct의 첫 번째 멤버에 액세스하는 방법을 알고 싶습니다. 나는 이것을 시도했다 :

#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);
}

그러나 그것은 약간의 쓰레기를 인쇄합니다. 비슷한 방식으로 어떻게 설정할 수 있습니까?

답변

Barmar Aug 20 2020 at 23:57

할당은 다음과 같아야합니다.

*(int*)p = val;

당신은에 할당 할 int포인터에 대한 포인터이어야한다, 그래서 멤버 int에 대한 포인터가 아닌 포인터 int. 그리고 할당되는 값은 int; &val에 대한 포인터 int입니다.

3 MatthiasBerndt Aug 21 2020 at 00:01

당신이하고있는 일은 p->a의 주소를 val(구현에 따라 32 비트로 잘릴 수 있음) 값을 설정하는 것입니다 .

포인터를 통해 필드에 액세스하려면 필드의 주소를 가져와 역 참조 된 포인터에 할당해야합니다.

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

물론 그냥 쓸 수도 있습니다 p->a = val. 참고 p->a단지의 약어입니다 (*p).a.