문제
에서 우리의 코드를 우리가 사용하는 뭔가가 다음과 같다:
*(controller->bigstruct) = ( struct bigstruct ){ 0 };
이용 작업,그리고 우리는 업그레이드 버전의 GCC 갑자기 보이기 시작했 stack overflow.보고 어셈블리,오래 된 GCC 코드(2.x)는 기본적으로 하는 이것:
memset(controller->bigstruct, 0, sizeof(struct bigstruct));
새로운 GCC(3.4.x)이 일
struct bigstruct temp = { 0 };
controller->bigstruct = temp;
를 검토한 후 C99 사양을 볼 수 있었다 왜;C99 는 기본적으로 익명 구조물에 존재 합니다.그것은 좋은 개념이지만,이 구조는 4Mb 대만 적용에 존재하는 힙!
우리가 의지를 만드는 우리 자신''초기화 함수는 명시적으로 설정합 회원은,하지만 추하고 유지 관리 두통입니다.나는 생각하지 않 작성 memset 적절한 솔루션이기 때문에,나는 알 수 없는 비트 값이 0 이는 적절한 제한 값을 입력(nit 따기에,나는 알고 있지만,거기 당신은;나지 않음을 컴파일러는,그것 때문에 그것이 수 알)
무엇이"올바른",또는 적어도,최고의 방법으로 초기화하는 대형 구조이 같은가?
을 furthur 이유를 명확히 생각 작성 memset 지 않는 솔루션:이 규칙의 초기화는 회원의 명시적으로 초기화되지 않은 동일한 정적으로 초기화하고,다음과 같습니다:-이 있는 경우 포인터 입력,초기화 null pointer;-이 있는 경우 산술 유형,초기화됩(긍정적 인 또는 서명)제;...
'작성 memset'를 설정합니다 메모리를 비트 패턴로지 않는 반드시 동일한 것입니다.상상해 보는 시스템을 사용하지 않는 IEEE 부동 소수점의 숫자입니다.특이한,하지만 지원됩니다.의 표현 0.0doesn't have to mean"모든 비트를 제로"수 아무것도 편리하는 프로세서입니다.
해결책
작성 memset 는 방법입니다.당신이 많지 않은 대안이 있다.
다음과 같은 것:
#define InitStruct(var, type) type var; memset(&var, 0, sizeof(type))
그래서 당신은:
InitStruct(st, BigStruct);
다음 사용하 st 평소와 같이...
지 않을 얻는 방법"0"유효하지 않은"0"형식에 대한 구조체.유일한 방법은"대용량 초기화"구조체를 설정하는 모든 메모리의 값으로;그렇지 않으면 당신은 것을 만들의 논리를 말을 사용하여 특정 비트 패턴당 회원입니다.최고의"일반"비트 패턴을 사용은 0 입니다.
게다가 이 같은 논리는 당신은 사용을 할 때
*(controller->bigstruct) = *( struct bigstruct ){ 0 };
그러므로 내지 않을 얻을 거부감 사용하려면 다음과 같이 하십시오.)
첫 번째 코멘트를 이 게시물을 만들어 나에게 약간 연구를 하기 전에 나는 그를 부르고 멍청하고 나는 이것을 발견:
http://www.lysator.liu.se/c/c-faq/c-1.html
매우 흥미로운;할 수 있다면 투표-up 다:)
말-당신의 옵션만을 대상으로 하려면 오래된 아키텍처와 함께 non-0null 값은 여전히 할 수동 초기화가 특정 회원입니다.
감사 토마스 Padron-McCarthy!뭔가 새로운 것을 배웠다 오늘:)
다른 팁
당신이 사용하고 싶지 않은 작성 memset,당신은 항상 수 있는 선언의 복사본을 정적 구조체 및 이용,방 줄 것이 유사한 성능을 제공합니다.이 4 메가 프로그램이지만 아마도 나보다는 설정을 개별적인 요소입니다.
는 경우,GCC 었을 사용하여 작성 memset,그리고 그것은 좋은 충분히 이전에,내가 그것은 좋은 충분히 지금입니다.
로 작성 memset 는 방법입니다.그러나, 지 사용 작성 memset C++체,특히 그들과 함께 가상의 방법이 있습니다.이 sizeof( foo )
이 포함됩니다 테이블의 가상 함수 포인터가 작성 memset 에는 것입니다 심각한 슬픔을 할 수 있습니다.
만약 작성 memset 문제가 해결되지 않 그 자체로서,단순히 작성 memset 고 다음 초기 구성원이어야 하는 non-zero(i.e비 IEEE 부동 소수점 값).
개인 초기화 기능을 하지 못생긴 오히려 좋은 OO 방법을 초기화체(구조).나는 가정의 구조 4MB 의 포인터,그래서 나는 이 솔루션은 다음과 같이해야한다:
void init_big_struct(struct bigstruct *s)
{
memset(s, 0, sizeof(struct bigstruct));
s->some_pointer = NULL; // Multiply this as needed
}
에서 다른 손으로 우리의 코드를 실행하에 더 많은 다음 20 임베디드 운영 체제의 큰 숫자를 다른 기계설비,결코 만나지 않는 어떤 문제로만 작성 memset 의 구조체.
hmm 지 모를 만드는 초기화 기능 및 설정은 각 구성원이 명시적으로는 옳은 일을-이 방법을 생성자에 OO 언어로 작동합니다.
와 두 번째 사람이 알고 있는 하드웨어를 구현하는 비 IEEE 부동 소수점 번호?-아마도 코모도 64 또는 somethig;-)