작성
·
368
0
char name[128];
int result = scanf("%s", name);
char words[STRLEN] = "";
gets(words);
1. 이렇게 됐을 때 에러뜨면서 컴파일 실행이 안되는데 이유가 뭔가요? 예전에 getchar 쓸 때도 scanf가 위에 있으면 컴파일 못 읽는 현상 나왔던 것 같은데..
그냥 함수의 기능만 하는거면 상관없지 않나요? 뭔가 충돌이 되는건가요?
2. 그리고 buffer는 전 강의와 관련지었을 때 어느 메모리에 위치하고 있나요? TEXT Segment? gets(word)에서 word[5] 일때 helloo 를 입력하면 run-time error가 걸리는데 메모리 관점에서 권한을 주지 않은 곳을 접근하거나 읽기전용의 data를 수정하려드니 해킹하지말라고 운영체제가 차단시키는 걸로 인지하고 있습니다. 근데 gets는 buffer에 저장된 것들을 읽는 거니까 그럼 buffer는 TEXT Segment 또는 그 안의 read only data에 위치하는 건가 궁금하네요. 근데 쓰다보니 beffer는 소모성이라 읽고나면 날라가니까 text segment에 저장되어있지 않을 것이라고 생각은 드네요?
답변 1
1
안녕하세요 😃
1. 저는 에러가 안뜨는데 어떤 에러가 뜨시는지 알려주실 수 있을까요? (질문글 쓰실 때 강의 시간대와 에러 메세지도 꼭 같이 올려주시면 감사하겠습니다.) 저 같은 경우도 에러가 발생하지는 않지만 get 함수 자체가 실행이 안되고 넘어가네요! visual studio 버전에 따라 gets 함수 지원 유무가 다르다고 합니다.
2. 버퍼라함은 scanf 같은 입력 함수들이 사용하는 그 입력 버퍼 말씀하시는건가요?
https://stackoverflow.com/questions/20711728/what-is-the-difference-between-memory-buffer-and-stack
https://en.wikipedia.org/wiki/Data_buffer
저도 궁금해서 찾아봤는데 입력 버퍼는 메모리 레이아웃의 특정 segment 들 중 어딘가에 위치해 있다라는 정보는 찾기가 힘들더라구요 ㅠㅠ 보통 TEXT SEGMENT, STACK, HEAP 등등 이런 메모리 레이아웃 하면 '가상 메모리'의 레이아웃인데요, 이는 컴퓨터의 주 메모리인 RAM 뿐만 아니라 RAM 의 부족한 부분을 하드 디스크에서 끌고 와서 물리적인 메모리(RAM) 크기보다 더 큰 메모리를 사용하는 것처럼 하는 그런 효과를 내는 기법입니다. 제가 못 찾은 부분일 수 있지만 입력 버퍼는 특정 메모리 레이아웃 어딘가에 위치한다라고 정의되어 있는 정보는 찾을 수 없었습니다. 단, 입력 버퍼와 같이 임시로 잠시 쓰고 버리는! 그러니까 메모리에 저장하는게 목적이 아닌 이런 임시 데이터들은 Data Buffer 라는 곳에 저장이 된다고 하네요. 그리고 이는 무조건 RAM 에 저장된다고 합니다. 가상 메모리는 하드디스크도 쓰기에, 꼭 RAM 에 저장되리라는 보장은 없지만 이런 임시 메모리들은 '빨리' 쓰고 버릴 것들이기 때문에 무조건 RAM 에 저장이 되는 듯 합니다. (첨언하자면 RAM, 즉 메모리가 디스크보다 CPU에 접근하는 속도가 훨~씬 빠릅니다.)