2012-06-12 5 views
1

다음 코드는 실행하지 않는 것이 좋습니다. 이 예에서 :배열 길이보다 큰 인덱스의 요소에 액세스 할 수 있음

#include <iostream> 
using namespace std; 
int main() 
{ 
    char data[1]; 
    cout<<"Enter data: "; 
    cin>>data; 
    cout<<data[2]<<endl; 
} 

이 길이의 문자열을 입력 1보다 큰 어레이가 (예를 들어, "L")를 유지하기에 충분히 큰 것처럼 (예를 들어, "안녕하세요") 출력을 생성한다. 배열보다 긴 값을 저장하려고했거나 배열 길이보다 큰 인덱스 값을 검색하려고 시도했을 때 오류가 발생하지 않아야합니까?

+0

작동하지 않을 수도 있으므로이 동작에 의존해서는 안됩니다. – weidi

+0

관련 질문 : http://stackoverflow.com/questions/1239938/c-accesses-an-array-out-of-bounds-gives-no -error-why – nurettin

답변

3

다음 코드는 이 아닌데 일 때 실행되는 것 같습니다.

그것은 하지에 대한 "해야한다" 또는 "해야하지"입니다. 그것은 약 "할 수있다" 또는 "수도 없다"입니다. 이다

, 당신의 프로그램을 실행할 수도 있고 그렇지 않을 수도. 프로그램이 undefined behavior를 호출하기 때문에

이 때문이다. 배열 길이를 초과하는 배열 요소에 액세스하면 정의되지 않은 동작이 호출되어 의 어떤 것도이 될 수 있습니다. documentaton에 따라 정의되지 않은 결과를 제공하는 코드의 실행 때문에, 그것은 컴파일에 다른 매개 변수 아래에 충돌하거나 다른 컴퓨터에서 컴파일 할 수

#include <iostream> 
#include <string> 

//using namespace std; DONT WRITE THIS HERE 

int main() 
{ 
    std::string data; 
    std::cout<<"Enter data: "; 

    std::cin>>data; //read the entire input string, no matter how long it is! 

    std::cout<<data<<std::endl; //print the entire string 

    if (data.size() > 2) //check if data has atleast 3 characters 
    { 
     std::cout << data[2] << std::endl; //print 3rd character 
    } 
} 
+1

좋은 소리, 고마워. 나는 정의 된 행동이 문자열을 자르거나 예외를 던지는 것이라고 가정했다. 해명 해 주셔서 감사합니다 – mattsbox

1

:

코드를 작성하는 적절한 방법으로 std::string를 사용하는 것입니다.

1

이이 일을 할 안전하지 않습니다. 그것이하는 일은 버퍼 뒤에서 발생하는 메모리를 덮어 쓰는 것입니다. 그 후에, 그것은 당신에게 그것을 다시 읽습니다.

cincout 작업에 다음과 같이 표시되지 않기 때문에 작동합니다. 이것은 하나의 char에 대한 포인터이며 하나의 char 만 쓸 것입니다. 대신에 그것은 쓰여질 충분한 공간이 할당되었다고 말합니다. cincout 작업은 null 종결자인 \0에 도달 할 때까지 데이터를 계속 읽습니다.

이 문제를 해결하려면, 당신은 이것을 대체 할 수

std::string data; 

C++를 사용하면 큰 메모리 실수를하게됩니다. 당신은 대부분의 시간을 절약 할 수

일부 '규칙'

1 : 하지 사용 char[]를 수행합니다. 대신 string을 사용하십시오.

2 : 통과 또는 인수를 반환하지 사용 포인터를 수행합니다. 참조로 전달, 값순으로 반환.

3 : 은 배열 (예 : int[])을 사용하지 마십시오. vectors을 사용하십시오. 당신은 여전히 ​​자신의 범위를 확인해야합니다.

이 세 가지만 있으면 "안전한"코드와 C가 아닌 코드를 작성하게됩니다.

+0

버퍼 오버플로에 "큰 배열 할당"솔루션에 -1을 부여하고 싶습니다. – Hurkyl

+0

삭제 하시겠습니까? – Rhexis

+0

적어도 버퍼를 제거 할 수 있거나 적어도 버퍼에 저장할 수있는 것보다 많은 문자를 읽지 않도록 iostream 메커니즘을 도입하는 것이 좋습니다. 나는'std :: setw'가이 상황에서 효과가있을 것이라고 생각하니? 필자는 입력을 위해 조작자를 자주 사용하지 않았습니다. – Hurkyl

관련 문제