2013-02-14 2 views
0

"char array [3]"배열에 3 자 이상을 저장할 수있는 이유는 무엇입니까? 이 코드에서 예를 들어 :이 C 코드는 왜 작동합니까?

#include <stdio.h> 

char array[3]; 

main() 
{ 
scanf("%s", array); 
putchar(array[5]); 
return 0; 
} 

당신은 어떤 길이의 텍스트를 입력 할 수 있습니다, 그것은 6 편지를 인쇄합니다. "printf ("% s ", array)를 사용하여 전체 텍스트를 인쇄 할 수도 있습니다. 배열에 3 자의 공백 만 있는데 왜이 기능이 작동합니까?

+4

찾아보기 정의되지 않은 동작 –

+0

[이 코드가 C로 작동하는 이유] (http://stackoverflow.com/questions/13897817/why-this-code-works-in-c) – netcoder

+0

확실히이 코드는 복제본이어야합니다 ? 여러 개의 동일한 답변을 제공하기 전에이 유형의 질문을 닫는 것이 좋습니다. –

답변

3

코드가 전체 단어를 인쇄 할 수 없기 때문에 덮어 쓰기가 완료되었습니다. 메모리를 설정하고 즉시 읽는 중입니다. 프로그램 실행 중 나중에 해당 메모리 위치에서 읽으려고하면 전혀 다른 결과가 발생할 수 있습니다.

이것은 정의되지 않은 동작입니다. ... 그리고 귀하의 경우 "올바른"출력을 인쇄했습니다.

+0

아마도, 그렇지 않을 수도 있습니다. 그래서이 버그들은 최악의 종류입니다 ... –

+0

Thank you! 배열의 요소가 연속적인 메모리 주소에 저장된다는 의미입니까? 그렇지 않다면 배열의 요소를 어디에서 찾을 수 있는지 어떻게 알 수 있습니까? – Thomas

+0

@ 토마스 문자열 끝에 null 종결자를 찾습니다. – Inisheer

1

array은 전역 배열로 정의되어 있으므로 일반적으로 .bss 섹션의 일부 여야합니다. 시스템의 .bss 섹션에 충분한 메모리가 있기 때문에 동일한 메모리에 쓸 수 있습니다. 분명히 이것은이 섹션의 크기를 초과 할 때 잡힐 것입니다.

0

scanf()가 작동하는 방식 때문에, 송신 된 내용을 메모리에 계속 기록합니다. 쓰기 직후에 읽고 있기 때문에 배열에 사용 된 여분의 메모리는 아직 덮어 쓰지 않았으므로 전체 문자열을 다시 읽을 수 있습니다.
C에는 fgets()와 같은 입력을 제한하는 다른 함수가 있습니다.

관련 문제