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

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

Barbara Streisand
풀어 주다: 2024-12-29 14:59:15
원래의
264명이 탐색했습니다.

Why Do C and C   Compilers Ignore Array Lengths in Function Signatures?

함수 서명의 배열: 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 프로그래밍 언어에 내재된 부분입니다. 안전하고 효율적인 코드 개발을 위해서는 그 의미를 이해하는 것이 중요합니다.

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

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