[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 */
}