[c] 구조체를 0 / null로 초기화 / 재설정

struct x {
    char a[10];
    char b[20];
    int i;
    char *c;
    char *d[10];
};

이 구조체를 채우고 값을 사용하고 있습니다. 다음 반복에서 모든 필드를 다시 사용 0하거나 null다시 사용하기 전에 재설정하려고 합니다.

어떻게 할 수 있습니까? 내가 사용 memset하거나 모든 멤버를 거쳐 개별적으로해야합니까?



답변

초기 값으로 구조체의 const 정적 인스턴스를 정의한 다음 재설정 할 때마다이 값을 변수에 할당하면됩니다.

예를 들면 :

static const struct x EmptyStruct;

여기서는 초기 값을 설정하기 위해 정적 초기화 에 의존하고 있지만 다른 초기 값을 원한다면 구조체 이니셜 라이저를 사용할 수 있습니다.

그런 다음 루프를 돌 때마다 다음과 같이 작성할 수 있습니다.

myStructVariable = EmptyStruct;


답변

최신 C (C99)를 사용할 때 이러한 작업을 수행하는 방법은 복합 리터럴 을 사용하는 것 입니다.

a = (const struct x){ 0 };

이것은 David의 솔루션과 다소 유사하지만 빈 구조체를 선언하거나 선언할지 여부에 대해 걱정할 필요가 없습니다 static. const내가했던 것처럼를 사용하면 컴파일러는 적절한 경우 읽기 전용 저장소에 화합물 리터럴을 정적으로 할당 할 수 있습니다.


답변

위의 모든 것보다 구조체 초기화에 표준 C 사양을 사용하는 것이 좋습니다.

struct StructType structVar = {0};

여기에 모든 비트가 0입니다.


답변

C에서는 다음을 struct사용하여 메모리를 제로화하는 것이 일반적인 관용구입니다 memset.

struct x myStruct;
memset(&myStruct, 0, sizeof(myStruct));

기술적으로 말하면 NULL기계 의 포인터가 정수 값 0으로 표시 된다고 가정하기 때문에 이식성이 있다고 생각하지 않지만 대부분의 기계에서 이것이 사실이기 때문에 널리 사용됩니다.

C에서 C ++로 이동하는 경우 모든 개체에이 기술을 사용하지 않도록주의하십시오. C ++는 멤버 함수 나 상속이없는 객체에서만 이것을 합법적으로 만듭니다.


답변

C99 호환 컴파일러가있는 경우 다음을 사용할 수 있습니다.

mystruct = (struct x){0};

그렇지 않으면 David Heffernan이 쓴대로해야합니다.

struct x empty = {0};

그리고 루프에서 :

mystruct = empty;


답변

memset구조체의 크기와 함께 사용할 수 있습니다 .

struct x x_instance;
memset (&x_instance, 0, sizeof(x_instance));


답변

{}변수에 빈 집합 ( )을 할당 할 수 있다고 생각합니다 .

struct x instance;

for(i = 0; i < n; i++) {
    instance = {};
    /* Do Calculations */
}