2014-11-21 8 views
0

내 코드는 여기 - 왜 NZEC 오류가 발생합니까?

 void input(char* m) 
{ 
    char ch; 
    do 
    { 
     ch=getchar(); 
    } 
    while(ch=='\n'); 
    int i=0; 
    while(ch!='\n') 
    { 
     m[i++]=ch; 
     ch=getchar(); 
    } 
} 

는 NZEC 오류를 제공합니다. I는 문자 입력 카운트 제한 그러나 이러한 괜찮을 건네 this-

void input(char* m, int len) 
{ 
    char ch; 
    do 
    { 
     ch=getchar(); 
    } 
    while(ch=='\n'); 
    int i=0; 
    while(ch!='\n'&&i<len-1) 
    { 
     m[i++]=ch; 
     ch=getchar(); 
    } 
} 

같이를 렌. 왜 그런가요?

답변

0

첫 번째 경우 버퍼 오버 플로우가 발생했습니다!

while(ch!='\n')은 입력 한 문자의 수에 관계없이 '\ n'까지 반복됩니다. 문자 버퍼에 m이 가리키는 공간보다 많은 문자를 입력하면 메모리가 손상 될 수 있습니다. 물론, 두 번째 경우에는 len이이를 피할 수 있습니다.

두 경우 모두 버퍼에 널 종결자가 없음을 유의하십시오. 따라서 문자열을 매우 길게 만들 수 있기 때문에 C 문자열로 m을 처리하면 메모리 또는 버퍼 오버플로가 충분하지 않을 수도 있습니다.

void input(std::string& m) { 
    // ... 
    m.push_back(ch); // instead of m[i++]=ch 
    // ... 
} 
+0

문자열의 값이 사전에 알려져

당신이 이제까지로 함수를 정의 간주 되세요. 그것은 버퍼를 초과하지 않을 것이다. 하지만 내가 알고 싶었던 것은 길이 매개 변수를 추가하는 것이 런타임 오류를 피하는 방법이었습니다. 그것들은 여전히 ​​버퍼 오버 플로우가 될 수 있습니다. – goelakash

+1

길이 매개 변수에서 버퍼의 최대 길이를 전달하므로 루프가 끝나면 루프가 종료됩니다 ('\ n'이 없더라도). – Christophe

+0

이론적으로 길이 매개 변수는 임의적 일 수 있습니다. 버퍼 크기를 초과 할 수도 있습니다. 문법을 이해합니다. – goelakash