> 백엔드 개발 > C++ > C 및 C에서 자동 구조 및 배열의 ​​부분 초기화가 허용되고 정의됩니까?

C 및 C에서 자동 구조 및 배열의 ​​부분 초기화가 허용되고 정의됩니까?

Barbara Streisand
풀어 주다: 2024-12-11 08:49:10
원래의
967명이 탐색했습니다.

Is Partial Initialization of Automatic Structures and Arrays in C and C   Allowed and Defined?

C 및 C에서 자동 구조 및 배열의 ​​부분 초기화

오해는 자동 구조 및 배열의 ​​부분 초기화가 잘못된 가정에서 비롯됩니다. C에서는 허용됩니다. 이러한 믿음과는 달리 표준에서는 완전 초기화 또는 초기화 없음이라는 두 가지 경우만 명시적으로 정의합니다.

부분 초기화

"부분 초기화"라는 용어는 표준에 정의되어 있지 않습니다. 구조체나 배열에 있는 멤버의 하위 집합만 초기화하는 것을 의미합니다.

완전 초기화

완전 초기화는 구조체나 배열의 모든 멤버가 명시적으로 초기화될 때 발생합니다. 예:

struct somestruct {
  int a;
  int b;
  int c;
};

somestruct s = {1, 2, 3};
로그인 후 복사

초기화 없음

초기화가 제공되지 않으면 동작은 변수의 저장 유형에 따라 달라집니다.

  • 스택에 있는 자동 변수의 경우 초기화되지 않은 멤버는 초기화가 보장되지 않습니다. 해당 값은 불확실합니다.
  • 정적 변수(전역 또는 파일 범위 포함)의 경우 초기화되지 않은 멤버는 정수 유형의 경우 0으로, 포인터 멤버의 경우 NULL로 초기화됩니다.

부분 초기화 실습

표준 동작이 아님에도 불구하고 자동 구조체 및 배열 멤버의 부분 초기화 Visual Studio 및 gcc/g 를 포함한 대부분의 컴파일러에서 지원됩니다.

C Standard(C99)

섹션 6.7.8.21 초기화

집합의 요소 또는 멤버 수보다 적은 수의 이니셜라이저가 제공되는 경우 나머지 요소는 0으로 초기화됩니다.

C 표준(C 03)

섹션 8.5.1 집계

초기화 프로그램이 더 적은 경우 , 초기화되지 않은 멤버는 값이 초기화됩니다. 값 초기화는 객체 유형에 따라 다릅니다. 예를 들어, 유니온이 아닌 클래스 유형의 비정적 데이터 멤버는 값으로 초기화되는 반면, 정수와 같은 기본 유형은 0으로 초기화됩니다.

결론

부분 자동 구조 및 배열의 ​​초기화는 제대로 처리되지 않으면 정의되지 않은 결과를 초래할 수 있는 비표준 동작입니다. 이식성과 정확성을 보장하려면 항상 완전히 초기화하거나 초기화하지 않도록 하세요.

위 내용은 C 및 C에서 자동 구조 및 배열의 ​​부분 초기화가 허용되고 정의됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿