cktmdgns   1년 전

22번줄에 if문에서 나는것 같은데 왜나는 것이죠 ?ㅠㅜ

Hibbah   1년 전

제 생각엔 아마 문자열의 끝을 의미하는 NULL문자 때문이 아닐까 하는 생각이 드네요

결론부터 말씀드리자면, 입력되는 문자열의 '최대길이+1' 이상으로 배열의 크기를 설정하시면 됩니다

이 문제에서 문자열의 최대 길이는 100만이므로 char a[1000001]로 선언하시면 아마 정답이 나올 것 같네요

cktmdgns   1년 전

감사합니다 ㅎㅎㅎ

Hibbah   1년 전

좀 더 자세히 설명드리자면..

char str[ ] 형태에 저장된 문자열을 출력할때 보통 printf("%s", str)을 사용하는데, 여기서 str은 해당 배열(문자열)의 시작 주소를 의미합니다.

시작하는 위치만 알려줬을뿐인데 문자열이 끝나는 위치를 알아서 잘 찾아 출력하는것은 문자열을 입력받을때 기본적으로 '엔터'위치를 'NULL'로 대체해주기 때문입니다.

즉, 넘겨준 시작위치부터 NULL을 만날때까지만 문자를 출력해주는 것이죠.

strlen함수도 마찬가지로, 인자로 넘겨준 주소값부터 시작해서 최초로 NULL문자를 만날때까지의 길이를 반환해 주는 원리입니다.

방금 말씀드린 내용을 발생한 런타임에러 상황이랑 같이 설명드리자면,

입력받을 배열의 크기는 100만으로 선언했는데, 최대길이(100만)인 문자열이 입력됬을 경우에

모든 문자는 제대로 입력되지만, 문자열의 끝을 의미하는 NULL값이 선언된 배열의 크기를 벗어난 메모리에 삽입되기 때문에

22번 라인의 strlen(a)에서 배열의 크기를 벗어난 메모리를 참조하게 되기 때문입니다. (NULL값은 a[1000001]에 삽입되므로..)

제가 말씀드린게 모~~두 맞는 말인지는 정확히 모르겠네요.....

제가 알기로 배열의 범위를 벗어나더라도 메모리상에서 데이터 삽입은 되는걸로 아는데, 해당 영역을 참조할 때 런타임 에러가 발생하는걸로 알고 있어요

혹시 틀린 부분이 있다면 읽으시는 다른분들께서 꼭 지적해주시길...!! ㅎㅎ..

댓글을 작성하려면 로그인해야 합니다.