2017-01-11 1 views
-1

이 기본 C++ 프로그램이 완료된 후 왜 멈추는 지 이유는 코드 TurboC++으로 돌아 가지 않습니다. 그러나, 그것은 1과 3자를 가진 낱말을 위해 잘 작동한다. 또한 CodeBlocks에서 완벽하게 실행됩니다. 내가 문자 *문자 이름 [20]을 변경하는 경우완료 후 프로그램 멈춤

#include<conio.h> 
#include<stdio.h> 
#include<iostream.h> 
#include<string.h> 

void main() 
{ 
    clrscr(); 
    char * name; 
    cout<<"Enter your name : "; 
    gets(name); 
    int len = strlen(name); 
    for(int i=0;i<len;i++) 
    { 
     cout<<name[i]<<" "<<i<<endl; 
    } 
    getch(); 
} 

, 그것은 완벽하게 작동합니다. 누구든지 그 이유를 설명해 주시겠습니까? char *에 문제가있는 경우 CodeBlocks가 문제없이 실행하는 이유는 무엇입니까?

+3

왜 TurboC++를 사용하고 있습니까? 그 일은 적어도 30 년이 넘었습니다! C++이 표준화되기 전에 제대로 작동하지 않는 것은 당연합니다. gcc 또는 다른 것으로 CodeBlocks를 사용하십시오 ** ** TurboC++가 아닌 **. – Rakete1111

+0

나는 형제를 알고 있지만, 누군가이 의심으로 내게왔다. 나는 그것을 알아낼 수 없었다. –

+4

변수'name'은 포인터입니다 만, 포인터는 어디에 있습니까? 대답 할 수있을 때 무엇이 ​​잘못되었는지 알 수 있습니다. –

답변

4

name에 메모리를 할당하지 않았습니다.

소유하고있는 메모리를 가리 키지 않는 포인터를 사용할 때의 동작은 이며 정의되지 않음은입니다.

그 이유는 char name[20];입니다. gets은 안전하지 않으므로 읽는 문자 수를 제어 할 수 없으므로 문자 버퍼가 오버런 할 수 있습니다. std::string, cin 및 최신 컴파일러를 사용하지 않으시겠습니까?

+2

@VaibhavVats 존경심으로 다른 사용자를 치료하십시오. 또한 코멘트는 강력하게 권장하지 않습니다. 더 나은 귀하의 의견의 건설적인 부분을 남겨주세요 –

+0

실제로 둘 다;) 만약 내가 존경과 함께 더 나은 위협을 받고 :) 그러나 나는 심지어 당신의 코멘트 전에 오타를 발견 –

+0

나는 오버플로를 스택에 새로운 오전, 그래서 현재에 대해 배우고있다 여기 규칙. 죄송합니다. –

관련 문제