2015-01-10 2 views
0

아래 코드에 대해 혼란 스럽습니다 ... 분명히하십시오. 10 자 - qwertyuiop :배열 문자가 예상보다 길어짐

#include<iostream> 
    using namespace std; 
int main() 
{ 
    char array[10]; 
    cin>>array; 
    int i=0; 
    while(array[i]!='\0') 
     { 
     cout<<array[i]; 
     i++; 
     } 
} 

및 입력을 제공 :이 코드를 사용

. 다시 출력은 qwertyuiop입니다.

그러나 아래 코드에서와 같이 배열을 초기화하면 문자열이 배열에 비해 너무 길다는 오류가 발생합니다! 설명?

#include <iostream> 
using namespace std; 

int main() { 
char array[10]="qwertyuiop"; 
int i=0; 
while(array[i]!='\0') 
    { 
    cout<<array[i]; 
    i++; 
    } 
} 
+2

첫 번째 예는 버퍼 오버 플로우이고 11 번째'char'을 10 개의'char' 배열에 넣으려고하기 때문에 두 번째 컴파일은 컴파일되지 않습니다. – Blastfurnace

답변

0

첫 번째 코드 단편은 투명 행운으로 작동합니다. 만 저장할 수있는 배열에 10자를 입력합니다. C 스타일 문자열에서 마지막 위치는 종료 0에 필요합니다. 당신은하지 훨씬 개 9 이상의 문자를 입력

  1. :

    때문에 두 가지 (관련) 이유 일 것으로 보인다. 많은 것을 입력 해보십시오. 프로그램이 반드시 중단됩니다.

  2. 우연히 스택에있는이 배열 바로 다음에 메모리에 0이 있어야합니다. 그렇지 않은 경우 출력 루프는 메모리가 부족 해지거나 다른 곳에서는 0이 발생할 때까지 데이터를 계속 인쇄합니다.

기술적으로 "버퍼 오버플로"입니다. 가 종료 0의 여지가 없다는 것을 지적 - 컴파일러는 길이 의 배열 N에 정확히 N 문자를 저장하지 말아야 알고 있기 때문에

두 번째 조각의 오류입니다.

+0

고맙습니다. – sgoel

3

다음은 버퍼 오버 플로우의 예입니다. 입력 문자열은 array의 끝에 몇 바이트를 다시 씁니다. 그러나 이것은 런타임 문제이며 컴파일 타임에 감지 할 수 없습니다.

코드의 실제 문제는 프로그램의 동작이 비 결정적이라는 것입니다. 언젠가는 프로그램이 충돌 할 수 있습니다. 언젠가는 그렇지 않을 수도 있습니다.

합리적인 크기의 버퍼 (실제로는 100 자 이상)가 필요하며 제한된 입력 방법을 사용하십시오.

+0

그래서이 경우에 'p'인 10 번째 문자까지는 무엇을 말하고 있습니까? 배열이 올바르게 유지됩니다. 이제 cin은 문자열을 자동으로 자르지 만 위의 작업을 수행 할 여유 공간이 없기 때문에 프로그램은 인접한 메모리를 차지합니다. Short에서는이 문자열이 잘리지 않습니다? – sgoel

+0

@ user3800101 :'std :: cin'은 자동으로 아무 것도 자르지 않습니다. 그것은 배열의 끝을 지나서 쓰고 인접한 메모리를 clobbers. – Blastfurnace

+0

프로그램이 어떻게 완료되었는지 자동으로 자르지 않습니다. 'while'은 절대로 멈추지 않아야했기 때문에? – sgoel

관련 문제