programing

힙의 구조체 구성원을 초기화하는 방법

lastmoon 2023. 6. 11. 11:13
반응형

힙의 구조체 구성원을 초기화하는 방법

힙에 구조물을 할당하고 초기화한 후 함수에서 포인터를 반환하고 싶습니다.이 시나리오에서 구조체의 구성원을 초기화할 수 있는 방법이 있는지 궁금합니다.

#include <stdlib.h>

typedef struct {
  const int x;
  const int y;
} ImmutablePoint;

ImmutablePoint * make_immutable_point(int x, int y)
{
  ImmutablePoint *p = (ImmutablePoint *)malloc(sizeof(ImmutablePoint));
  if (p == NULL) abort();
  // How to initialize members x and y?
  return p;
}

여기서 const members를 포함하는 힙의 구조체를 할당하고 초기화하는 것이 불가능하다고 결론을 내려야 합니까?

이와 같은 경우:

ImmutablePoint *make_immutable_point(int x, int y)
{
  ImmutablePoint init = { .x = x, .y = y };
  ImmutablePoint *p = malloc(sizeof *p);

  if (p == NULL) abort();
  memcpy(p, &init, sizeof *p);

  return p;
}

(C++와 달리, 다음의 반환 값을 캐스트할 필요가 없습니다.mallocC에서, 그리고 그것은 종종 다른 오류를 숨길 수 있기 때문에 나쁜 형태로 간주됩니다.

만약 이것이 C++이 아니고 C라면, 나는 타입 시스템을 전복시키는 것 외에 다른 해결책이 없다고 봅니다.

ImmutablePoint * make_immutable_point(int x, int y)
{
  ImmutablePoint *p = malloc(sizeof(ImmutablePoint));
  if (p == NULL) abort();

  // this 
  ImmutablePoint temp = {x, y};
  memcpy(p, &temp, sizeof(temp));

  // or this
  *(int*)&p->x = x;
  *(int*)&p->y = y;

  return p;
}

만약 당신이 구조를 유지해야 한다고 주장한다면, 당신은 그것을 피하기 위해 약간의 주조를 해야 할 것입니다.

int *cheat_x = (int *)&p->x;
*cheat_x = 3;

나는 카페의 접근 방식을 좋아하지만, 나도 이런 생각이 들었습니다.

ImmutablePoint* newImmutablePoint(int x, int y){ 
   struct unconstpoint {
      int x;
      int y;
   } *p = malloc(sizeof(struct unconstpoint));
   if (p) { // guard against malloc failure
      *p.x = x;
      *p.y = y;
   }
   return (ImmutablePoint*)p;
}

언급URL : https://stackoverflow.com/questions/2219001/how-to-initialize-const-members-of-structs-on-the-heap

반응형