> 백엔드 개발 > C++ > 구조체 내에서는 배열 할당이 허용되지만 C 및 C의 독립 실행형 배열에는 허용되지 않는 이유는 무엇입니까?

구조체 내에서는 배열 할당이 허용되지만 C 및 C의 독립 실행형 배열에는 허용되지 않는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-24 21:48:15
원래의
283명이 탐색했습니다.

Why are Array Assignments Allowed Within Structs but Not for Standalone Arrays in C and C  ?

C 및 C의 배열 할당: 구조 및 철학적 통찰에 대한 예외

C 및 C에서는 예시와 같이 배열을 직접 할당하는 것이 금지됩니다. 다음 사항에 따라:

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;
로그인 후 복사

이 경우 구조체 내의 배열을 멤버별로 할당할 수 있습니다. 이는 멤버별 배열 할당이 구조체에 대해서는 지원되지만 일반적으로는 지원되지 않는 이유에 대한 의문을 제기합니다.

진화적 근거

배열 동작의 기원은 역사적 발전에 있습니다. B와 BCPL에서 배열은 암시적으로 형식화되지 않은 포인터로 처리되었습니다. B의 구조에는 배열을 수용하기 위한 특별한 처리가 필요했으며 이로 인해 구조체 내의 배열이 컴파일러 추적 엔터티로 처리되었습니다.

이렇게 하면 일반적으로 배열 할당을 허용하지 않게 되었습니다. 배열의 기본 포인터. 호환성을 유지하기 위해 구조체 내 배열에 대해서도 배열 할당을 허용하지 않았습니다.

구조체 할당과 부작용

C에서 구조체 할당이 도입되었을 때, 구조체의 원시 메모리에 대한 간단한 memcpy입니다. 이 할당 동작은 실수로 구조체 내의 배열로 확장되었습니다.

구조체 할당은 이미 언어의 일부였으므로 배열 할당 동작을 변경하려고 하면 기존 코드가 손상될 수 있습니다. 결과적으로 구조체 내의 배열 할당은 의도하지 않은 일이더라도 예외로 남아 있습니다.

철학적 관점

언어 설계 관점에서 볼 때 배열은 배열과 달리 구조체는 일류 시민으로 의도된 적이 없습니다. 포인터로서의 기능은 잠재적인 인체공학적 이점보다 이전 버전과의 호환성을 우선시했습니다.

게다가 일반적인 배열 할당을 도입하면 실수로 포인터를 생성하거나 메모리 누수가 발생할 가능성과 같은 합병증이 발생했을 것입니다.

결론

구조체 내 멤버별 배열 할당 지원은 초기 진화에서 비롯된 역사적 유물입니다. 이는 호환성 문제로 인해 지속되어 왔으며 단순성과 이전 버전과의 호환성을 우선시한다는 언어의 기본 디자인 철학을 상기시키는 역할을 합니다.

위 내용은 구조체 내에서는 배열 할당이 허용되지만 C 및 C의 독립 실행형 배열에는 허용되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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