2016-07-17 2 views
1

자바/C++ 개발자는 여기에 있습니다. C를 배우려고하지만 배열에 대한 메모리 할당과 혼동 스럽습니다.C - 배열 허용 범위를 벗어 납니까?

여기 무슨 일입니까?

#include <stdlib.h> 
#include <stdio.h> 
#include <windows.h> 

int main() 
{ 
    int az[3]; 
    az[2] = 66; 
    az[8] = 5214; 

    printf("%d\n", az[8]); 

    system("pause"); 
    return 0; 
} 

출력

5214 

어떻게 그 수 있는가? Out of Bounds 예외 또는 프로그램 충돌이 발생하지 않는 이유는 무엇입니까? 나는 이것을 무한히 할 수 있을까? 이 경우 배열의 길이는 얼마입니까? 배열로 인해 값이 범위를 벗어날 수 있다면 malloc을 통해 메모리를 할당하는 것이 무엇입니까? 이것은 나에게 제로를 의미합니다.

enter image description here

+0

C는 범위를 벗어난 것에 대해 불평하지 않습니다. 그처럼 간단합니다. – icbytes

+1

동작은 '정의되지 않음'입니다. 정확히 의미합니다. 충돌 할 수 있습니다. 쓰레기를 출력 할 수 있습니다. sigsegv 수 있습니다. minecraft의 복사본을 시작할 수 있습니다. C/C++에는 가드 레일이 없습니다. – evaitl

+1

참고로 C++에서 동일한 작업을 수행 할 수 있습니다. 그것은 C 또는 malloc에 ​​고유하지 않습니다. – qexyn

답변

4

는 C는 확인 어떤 경계를 수행하지 않습니다. 길이가 3 인 배열을 인덱스 8로 인덱싱하면 프로그램에서 사용되는 다른 메모리를 미묘하게 손상 시키거나 특정 배열을 메모리에 배치하는 방법에 따라 즉각적인 세그멘테이션 결함이 발생할 수 있습니다.

이 유형의 오류는 "버퍼 오버플로"라고 불릴 수 있으며 인덱싱하기 전에 어레이 경계를 확인하지 않으면 런타임에 프로그램이 악의적으로 변경 될 수 있으므로 보안 취약성의 일반적인 원인입니다.

C 코딩의 미친 흥미 진진한 세계에 오신 것을 환영합니다!

관련 문제