> 백엔드 개발 > C++ > 컴파일러가 C/C 함수 서명의 배열 길이를 무시하는 이유는 무엇입니까?

컴파일러가 C/C 함수 서명의 배열 길이를 무시하는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-22 16:28:15
원래의
547명이 탐색했습니다.

Why Are Array Lengths in C/C   Function Signatures Ignored by the Compiler?

C/C 함수 서명의 배열 길이: 혼란스러운 예외

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 모두에서 여전히 널리 퍼져 있습니다.

개발자에게 미치는 영향

이 배열 전달의 특이한 점은 여러 가지 의미를 갖습니다.

  • 함수 시그니처의 배열 길이는 함수의 동작에 영향을 주지 않으므로 무시해야 합니다. code.
  • 이러한 모호함을 피하기 위해 배열을 포인터(예: char *a)로 선언할 수 있습니다.
  • 배열을 함수에 전달할 때 배열 인덱스가 경계 내에 있는지 확인하는 것이 중요합니다. , 함수 시그니처에는 길이 정보가 없기 때문입니다.

위 내용은 컴파일러가 C/C 함수 서명의 배열 길이를 무시하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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