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;
memset
하면 더럽게 느껴집니다. 가능한 한 컴파일러가 메모리 레이아웃에 대해 걱정하도록하는 것을 선호합니다. 엄밀히 말하면 이러한 사용은 memset
이식이 불가능하지만 실제로 중요한 곳에서 코드를 컴파일 한 적이 있다면 놀라 울 것입니다. 따라서 원하는 경우 memset을 안전하게 사용할 수 있습니다.
최신 C (C99)를 사용할 때 이러한 작업을 수행하는 방법은 복합 리터럴 을 사용하는 것 입니다.
a = (const struct x){ 0 };
이것은 David의 솔루션과 다소 유사하지만 빈 구조체를 선언하거나 선언할지 여부에 대해 걱정할 필요가 없습니다 static
. const
내가했던 것처럼를 사용하면 컴파일러는 적절한 경우 읽기 전용 저장소에 화합물 리터럴을 정적으로 할당 할 수 있습니다.
{ 0 }
하고 기본 이니셜 라이저로 간주합니다. 그 경고를 끄면 허위 경보입니다.
위의 모든 것보다 구조체 초기화에 표준 C 사양을 사용하는 것이 좋습니다.
struct StructType structVar = {0};
여기에 모든 비트가 0입니다.
{}
C ++에서 사용할 수 있습니다 . gcc 개발자는 C ++가 지원해야하는지 확신이 서지 않는{0}
것 같고 표준의 해당 부분에 익숙하지 않습니다.
{0}
또는에 너무 많은 이식성 문제가 있었기 때문에 memset ()을 사용하게되었습니다 {}
. C & C ++ 표준이 명확하고이 문제와 일치하는지 확실하지 않지만 컴파일러는 그렇지 않습니다.
struct StructType structVar = malloc (sizeof(StructType)); structVar ={0}
C에서는 다음을 struct
사용하여 메모리를 제로화하는 것이 일반적인 관용구입니다 memset
.
struct x myStruct;
memset(&myStruct, 0, sizeof(myStruct));
기술적으로 말하면 NULL
기계 의 포인터가 정수 값 0으로 표시 된다고 가정하기 때문에 이식성이 있다고 생각하지 않지만 대부분의 기계에서 이것이 사실이기 때문에 널리 사용됩니다.
C에서 C ++로 이동하는 경우 모든 개체에이 기술을 사용하지 않도록주의하십시오. C ++는 멤버 함수 나 상속이없는 객체에서만 이것을 합법적으로 만듭니다.
memset
구조체의 크기와 함께 사용할 수 있습니다 .
struct x x_instance;
memset (&x_instance, 0, sizeof(x_instance));
memset
옵션이지만 사용할 때 기록 된 메모리가 세 번째 매개 변수와 정확히 동일한 크기인지 확인해야합니다. 따라서 유형의 크기가 아닌 실제 객체의 크기를 참조하는 것이 좋습니다. 현재 알고 있습니다 . IOW memset (&x_instance, 0, sizeof(x_instance));
는 훨씬 더 나은 선택입니다. BTW : (void*)
C ++에서도 캐스트가 불필요합니다.
여기에 이미지 설명을 입력하십시오. gnu11에서 놀라움을 받으십시오!
typedef struct {
uint8_t messType;
uint8_t ax; //axis
uint32_t position;
uint32_t velocity;
}TgotoData;
TgotoData tmpData = { 0 };
0이 아닙니다.
memset
모든 것을 재설정하려는 경우에만 사용 하는 것보다 낫습니까0
??