문제

에서 우리의 코드를 우리가 사용하는 뭔가가 다음과 같다:

   *(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;-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top