2014-03-28 3 views
1

아래 {0}은 무엇을 의미합니까?{0}은 무엇을 의미합니까?

하나의 0 문자 배열? 하지만 더 작은 배열로 더 큰 배열을 초기화 할 수 있다고 생각하지 않습니까? 그리고 그것은 숯이 아닌 int 일 것입니다, 그래서 최소한 경고를 일으킬 것입니다, 그렇죠? 아니면 완전히 오해하고 있습니까? 이것에 의해, 버퍼의 최초의 문자가 제로가된다

struct ring_buffer 
{ 
    unsigned char buffer[SERIAL_BUFFER_SIZE]; 
    volatile unsigned int head; 
    volatile unsigned int tail; 
}; 

ring_buffer rx_buffer = { { 0 }, 0, 0 }; 
+0

''''이 경우 동일한 작업을 수행했을 것입니다. –

+0

내부의'{0}'는 실제로 표현의 전체 RHS가'{0}'만으로 이루어진 경우에 암묵적으로 이미 명시된 것을 명시 적으로 작성하여 독자/관리자의 이익을 위해 더 많이 표현 된 것 같습니다. '{{0}, 0,0}'. – DavidO

+0

"나는 생각하지 않습니다"- 아마도 더 적은 것을 생각하고 더 많은 문서를 읽을 수 있을까요? "최소한 경고를 유발할 것"- 경고를 내기 위해'char c = 'x';를 기대합니까? ''x''는 C에서 int입니다. –

답변

3

{0}은 "zero-init"이 구조체 또는 배열을 의미합니다. 위의 예제에서, rx_buffer.buffer는 그 순간에 스택에 있었던 모든 것이 아닌 모든 0 바이트로 채워질 것입니다.

은 모든 제로 바이트 전체 ring_buffer 구조체를 intializing 작동해야 다음 char array = { value1, value2, ...};

C에서, 배열 (또는 구조)의 경우 길이

ring_buffer rx_buffer = {0}; 
+0

'{0}'은 (는) 포인터가 널 포인터가되도록 초기화하므로 모든 변수 (배열 및 구조 포함)를 초기화하는 좋은 방법입니다. –

+0

"{0}은 특수한 경우가 아닙니다."{1}은 "첫 번째 항목을 1로 초기화하고 나머지 항목을 0으로 초기화"를 의미합니다. - 지정되지 않은 이니셜 라이저는 항상 0입니다. –

1

이 형식의 배열을 초기화 가 초기화에 사용한 값의 수보다 크면 컴파일러는 나머지 값을 자동으로 0으로 초기화합니다.

마찬가지로 구조를 초기화 할 수도 있습니다. 첫 번째 요소가 배열이기 때문에 귀하의 경우 배열은 모두 0으로 초기화됩니다. 따라서

는 설명하기 : ring_buffer rx_buffer = { { 0 }, 0, 0 };

이 유형의 구조 struct ring_bufferrx_buffer 변수를 선언하고 제로 모든 요소를 ​​초기화한다. 최초의 요소는 그 자체가 배열이기 (위해) 때문에, 통상의 배열의 초기화와 같은 방법으로 초기화됩니다.

1

그것은 UCHAR의 평균 제로 초기화 배열의 (모든 요소를 ​​0) rx_buffer.buffer = {0}

0

그러나 나는 당신을 당신이 작은 배열로 큰 배열을 초기화 할 수 있다고 생각하거나 할 수 없습니다? 배열이 부분적으로 초기화되면

, 초기화되지 않은 요소

이 {0}을 채우는 수단 변수를 초기화하면 How to initialize array to 0 in C?

0

도움이 될 해당 타입의 값 0을 수신 0으로. 이것은 변수의 제로화를 코드 검토 자에게 명시 적으로 표시하는 방법입니다. 초기화가없는 정적 변수는 기본적으로 0으로 초기화되므로 초기화는 컴파일러가 아닌 다른 개발자에게 보내는 메시지입니다.

그러나 0이 아닌 값이 뒤에 오는 경우 다른 의미를 갖습니다. 예를 들어 :

struct ring_buffer { 
    unsigned char buffer[SERIAL_BUFFER_SIZE]; 
    volatile unsigned int head; 
    volatile unsigned int tail; 
}; 

ring_buffer rx_buffer = { { 0 }, 1, 2 }; 

bufferhead은 아마 2

코드는 변경 될 수있다 일일 것으로 추정 코드의 작성자에게 1 tail로 초기화된다, 0으로 채워되는 것을 의미 미래의 버그를 피하기 위해 이것을 명시 적으로 만들었습니다.

관련 문제