C 및 C에서 함수 서명에는 int a[와 같이 대괄호 안에 배열 길이가 포함될 수 있습니다. 1]. 그러나 이 동작은 길이가 실제적인 영향을 미치지 않는 것처럼 보이므로 개발자를 당황하게 했습니다.
다음 예를 고려하십시오.
#include <iostream> int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; }
이 코드에서 dis 함수는 다음과 같은 배열 매개변수를 선언합니다. 길이는 1(a[1])이지만 a[2]에 액세스하는 것은 여전히 가능합니다. 이는 다음과 같은 질문을 제기합니다: 강제되지 않는 경우 컴파일러가 함수 시그니처에서 배열 길이를 허용하는 이유는 무엇입니까?
답은 C/에서 전달되는 배열의 고유한 동작에 있습니다. 씨. 다른 많은 언어와 달리 C와 C는 배열을 함수에 직접 전달하는 것을 허용하지 않습니다. 대신 배열의 첫 번째 요소에 대한 포인터가 전달됩니다.
결과적으로 함수 시그니처에 지정된 배열 길이는 관련이 없게 됩니다. 길이 정보는 포인터에 포함되지 않으므로 컴파일러는 괄호 안의 길이를 단순히 무시합니다.
이러한 동작은 1970년대 C 개발 초기 단계에서 내려진 결정에서 비롯됩니다. 수년에 걸쳐 혼란을 야기했지만 구문은 C와 C 모두에서 여전히 널리 퍼져 있습니다.
이 배열 전달의 특이한 점은 여러 가지 의미를 갖습니다.
위 내용은 컴파일러가 C/C 함수 서명의 배열 길이를 무시하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!