배열 멤버별 할당이 구조체 내에서만 지원되는 이유
일반적인 배열과 달리 구조체 내에 정의된 배열은 멤버별 할당을 즐길 수 있습니다. 배열을 다른 배열에 할당하는 것은 허용되지 않지만(__
num1 = num2;//
struct1 = struct2;//<pre class="brush:php;toolbar:false">int num1[3] = {1,2,3}; int num2[3]; num2 = num1; // "error: invalid array assignment" struct myStruct { int num[3]; }; struct myStruct struct1 = {{1,2,3}}; struct myStruct struct2; struct2 = struct1;
역사적이고 철학적 근거
이런 차이는 C의 진화에서 비롯됩니다. 초기 반복에서 배열은 기본적으로 크기 정보가 없는 포인터였습니다. 컴파일러에 필요한 데이터가 부족했기 때문에 할당이 방해를 받았습니다. 그럼에도 불구하고 구조체 내의 배열은 둘러싸는 구조체에서 해당 유형 및 크기 정보를 상속받아 예외적으로 처리되는 이점을 얻었습니다. 결과적으로 일반적인 제약 조건의 영향을 받지 않고 구조체 컨텍스트 내에서 멤버별로 할당될 수 있습니다.
이 관행은 개방형 배열 할당의 구현 문제를 해결하는 기이한 최신 C 및 C로 이어졌습니다. 일반적인 배열 할당을 도입하면 모호성과 호환성 문제가 발생합니다. 따라서 제한 사항은 유지되었으며 프로그래머는 명시적인 배열 복사에 memcpy를 사용하도록 권장되었습니다.
예외
함수 매개 변수가 배열 멤버를 지정할 수 있는 또 다른 설정으로 등장했습니다. 할당된. 다음 코드를 고려해보세요.
typedef int vec[3]; void f(vec a, vec b) { a = b; // pointer assignment }
a는 포인터 매개변수이지만 할당은 구조체 외부에 있음에도 불구하고 요소별 복사를 효과적으로 수행합니다. 이 예외는 본질적으로 함수 호출에서 값 의미를 허용하는 향상된 기능입니다.
위 내용은 배열을 직접 할당할 수 없지만 C/C의 구조체 내에서는 할당할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!