![[C] gets_s() 함수, 디버깅을 통한 메모리 구조 알아보기](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255BC%255D%2520gets_s%28%29%2520%25ED%2595%25A8%25EC%2588%2598%252C%2520%25EB%2594%2594%25EB%25B2%2584%25EA%25B9%2585%25EC%259D%2584%2520%25ED%2586%25B5%25ED%2595%259C%2520%25EB%25A9%2594%25EB%25AA%25A8%25EB%25A6%25AC%2520%25EA%25B5%25AC%25EC%25A1%25B0%2520%25EC%2595%258C%25EC%2595%2584%25EB%25B3%25B4%25EA%25B8%25B0%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3Drudevico&w=2048&q=75)
작성일: 20240505 최근 수정일: 20240505
OS: Windows 10 Pro 22H2 64bit language: C ver: - IDE: Visual Studio 2022 Community
Table of contents
선행지식
- ‘Debug - Windows - Memory - Memory 1’을 통해 디버그 시 Memory 창을 띄울 수 있다.

- Debugging 시
F10
을 눌러 다음 line으로 Step over할 수 있다.
- Hexadecimal(16진수) 0x00은 ASCII Code로
null
을 의미한다.

puts()
는null
을 만날 때까지 array에서 character를 put한다.
해당 게시글에서 사용할 예제 코드는 다음과 같다.
#include <stdio.h>
int main(void)
{
char szName[32] = { 0 }; //char 32개가 있는 array를 만들고 모두 0으로 채운다.
printf("이름을 입력하세요: "); //printf()는 line break 없음
//gets_s(szName, sizeof(szName));
gets_s(szName, sizeof(szName));
printf("당신의 이름은 ");
puts(szName); //puts()는 line break 있음
puts("입니다.");
return 0;
}
- line 5에서
F9
를 눌러 Breakpoint를 설정한다.

F5
를 눌러 Debugging을 시작한다.
이때 line 5에 Breakpoint가 있으므로 line 5 실행 직전에 멈춘다.
F10
을 눌러 Step over하면 line5의char szName[32] = { 0 };
이 실행된다.
즉, szName에 저장된 Memory Address는 32 byte의 크기를 가지고 모두 0x00으로 채워지게 된다.
- 이를 확인하기 위해 Memory1 Address에 ‘
szName
’을 입력한다.
→ szName에 저장된 address를 보여준다.


F10
을 두 번 누르면 line 9까지 실행하게 되고gets_s(szName, sizeof(szName));
로 인해szName
에 값을 입력받게 된다.

gets_s(szName, sizeof(szName));
이때 ‘david’라고 입력을 해보자.

- Memory 1 Address에서 방금까지 00 00 00 ..이던 메모리 주소에 보관된 값들이 변경된 것을 알 수 있다.

이때 fe라는 값들이 있는데 이는 Extended ASCII Table에서 정의된 값으로 메모리 주소는 확보했지만 특정한 값이 할당되지 않은 주소 공간에 채워넣는 임의의 값이라고 생각하면 된다.
F10
을 두 번 누르면 console에 다음과 같이 출력된다.

이는 line 11의
puts(szName);
에 의한 출력이다.puts(szName);
은 szName
에 보관된 Address로 이동하여 null(0x00)
을 만날 때까지 메모리 주소에 보관된 값을 put한다.6.에서의 그림과 같이 해당 Address에는 0x64 0x61 0x76 0x69 0x64 0x00 0xfe …의 값들이 보관되어 있으므로 0x00을 만날 때까지의 값들을 put한다.
따라서 console에 0x64(’d’), 0x61(’a’), 0x76(’v’), 0x69(’i’), 0x64(’d’)를 put하고 이후에
0x00(null)
을 만났으므로 put을 멈춘 것이다.reference.
[1] ASCII Table, Wikipedia
[2] Extended ASCII, Wikipedia
Share article