반응형
힙의 구조체 구성원을 초기화하는 방법
힙에 구조물을 할당하고 초기화한 후 함수에서 포인터를 반환하고 싶습니다.이 시나리오에서 구조체의 구성원을 초기화할 수 있는 방법이 있는지 궁금합니다.
#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++와 달리, 다음의 반환 값을 캐스트할 필요가 없습니다.malloc
C에서, 그리고 그것은 종종 다른 오류를 숨길 수 있기 때문에 나쁜 형태로 간주됩니다.
만약 이것이 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
반응형
'programing' 카테고리의 다른 글
mariadb에서 연결된 "데이터베이스"를 만드는 방법이 있습니까? (0) | 2023.06.11 |
---|---|
"예외가 호출 대상에 의해 던져졌습니다." 오류(mscorlib) (0) | 2023.06.11 |
파이썬에서 설치된 모든 패키지와 해당 버전을 나열하는 방법은 무엇입니까? (0) | 2023.06.11 |
FirebaseRemoteConfig 오류 "파라미터 키에 대해 'String' 유형의 값이 없습니다." (0) | 2023.06.11 |
WebAPI에서 POST 데이터를 가져오는 방법은 무엇입니까? (0) | 2023.06.11 |