4.3 문자열이 메모리에 저장되는 구조

공기훈·2021년 7월 22일
0

홍정모의 따배씨

목록 보기
7/49

메모리 저장

문자의 배열의 끝에는 항상 마침표 개념의 \0 이 필요

숫자의 배열

#include <stdio.h>

int main()
{
	int a = 1;
	int int_arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 배열 초기화

	printf("%i %i %i\n", int_arr[0], int_arr[1], int_arr[9]); // 0, 1, 9 위치의 메모리 가져온다.

	printf("%i\n", int_arr[10000]); // int_arr 은 10개, 즉 40 byte의 공간 차지
	// 10000과 같은 공간 외의 메모리를 읽게 하면 값이 정상적으로 나오지 않는다. 
}    

문자의 배열

#include <stdio.h>

int main()
{
	char c = 'a';
	char str1[10] = "Hello"; // null character
	char str2[10] = { 'H', 'i' }; // 두 가지 방법 모두 배열 초기화

	printf("%c\n", c);
	printf("%s\n", str1); // string의 format specifier
	printf("%s\n", str2);
    

Q. 10칸의 메모리 공간을 가지고 있다면, Hello 다음에 몇 칸 띄어서 Hi가 출력되지 않을까?

A. NO. null character인 \0을 만나게 되면 더 이상 출력을 하지 않는다.

    printf("%hhi %hhi %hhi %hhi %hhi\n",
		str2[0], str2[1], str2[2], str2[3], str2[4]); // 72 105 0 0 0
	
	/* char str3[10] = "Hello, World"; // array size is not enough */
	char str3[20] = "Hello, \0World"; 
	printf("%c\n", str3[10]); // r 출력
	printf("%s\n", str3); // Hello, 출력
}
char을 hhi와 같은 정수형을 format specifier로 쓰게 되면 해당 문자의 아스키 코드를 알 수 있게 된다.
참고! 마지막 예제와 같이 문자 중간에 \0이 오게되면, 그 전까지만 출력한다. 하지만 str3[10]을 출력하면 r이 출력되므로, 메모리에는 실제로 저장되어 있다.
profile
be a coding master

0개의 댓글