함수 서명의 배열: C 및 C의 흥미로운 변칙
C 및 C에서 배열 길이는 일반적으로 다음을 사용하여 함수 서명 내에서 지정됩니다. 구문 int a[크기]. 그러나 이러한 길이가 적용되지 않으면 이상한 동작이 발생합니다.
dis(char a[1])
다음 코드 조각을 고려하세요.
#include <iostream> using namespace std; int dis(char a[1]) { int length = strlen(a); char c = a[2]; // Attempt to access element beyond specified length return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; }
이 예에서 dis 함수는 크기 1의 배열 매개변수 a를 선언합니다. 그러나 프로그램은 컴파일러 오류 없이 이 크기를 초과하는 요소에 액세스합니다. 이는 다음과 같은 질문을 제기합니다: 강제되지 않는 경우 컴파일러가 함수 시그니처에서 배열 길이를 허용하는 이유는 무엇입니까?
기발한 언어 기능
답은 C 및 C는 함수 호출에서 배열을 처리합니다. 실제로 배열은 함수에 직접 전달될 수 없습니다. 대신 배열의 첫 번째 요소에 대한 포인터가 전달되며 배열 길이에 대한 정보는 전달되지 않습니다.
따라서 함수 서명(이 경우 [1]) 내에 지정된 크기는 컴파일러에서 무시됩니다. . 이 결정은 1970년대로 거슬러 올라가며 개발자들 사이에 심각한 혼란을 가져왔습니다.
프로그래밍에 대한 시사점
이러한 특징은 여러 가지 의미를 갖습니다.
이 동작은 혼란스러워 보일 수 있지만 이는 C 및 C 프로그래밍 언어에 내재된 부분입니다. 안전하고 효율적인 코드 개발을 위해서는 그 의미를 이해하는 것이 중요합니다.
위 내용은 C 및 C 컴파일러가 함수 서명의 배열 길이를 무시하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!