-
[문제해설]다음 코드의 출력 결과를 쓰시오.전자계산기조직응용기사/실기 필답형 기출문제 해설 2022. 2. 27. 18:15반응형
전자계산기조직응용기사 실기 필답형 기출문제 (C언어) - 2021년3회
다음 코드의 출력 결과를 쓰시오.
#include <stdio.h>
int main()
{
char a[][8] = {"ABC", "DEF", "GHI", "JKL"};
printf("%s \n",a[1]);
}
- 문제 해설 -
코드는 짧고 단순하지만, C언어 배열의 메모리 할당을 정확히 이해하고 있는지를 묻는 문제입니다.
유사하게 다시 출제될 가능성이 높으니, 배열의 메모리 할당을 정확히 이해하셔야 됩니다.
포인터와 sizeof() 함수를 통해서 배열의 메모리 할당을 살펴보겠습니다. 직접 실습을 해보시길 권합니다.
01 #include <stdio.h> 02 03 int main() 04 { 05 int i; 06 char a[] = {'a','b','c'}; 07 08 printf("배열 a의 크기 : %d\n",sizeof(a)); 09 printf("배열 a의 시작주소 : %d\n",a); 10 printf("\n"); 11 12 for(i=0;i<3;i++) 13 printf("a[%d]의 주소 : %d\n",i,&a[i],i,sizeof(a[i])); 14 15 return 0; 16 }
위 소스와 결과 화면은 1차원 배열의 메모리 할당을 이해하기 위함입니다.
06라인에서 배열 a을 선언하였고,
08라인에서 sizeof() 함수를 이용하여 배열 a의 크기를 출력하였습니다. sizeof()함수 반환 값의 단위는 byte입니다.
09라인에서는 배열의 이름을 이용하여, 배열의 시작 주소를 출력하였습니다.
12라인에서는 반복문 for()을 사용하며, 배열 a의 각 원소의 주소와 크기를 출력하였습니다.
이를 토대로 배열 a의 메모리 할당을 도식화하여 표현하면 다음과 같습니다.
배열의 특징은 위 그림처럼 메모리 할당이 연속적으로 된다는 것을 알 수 있습니다.
이번에는 2차원 배열의 메모리 할당을 살펴보겠습니다.
01 #include <stdio.h> 02 03 int main() 04 { 05 int i,j; 06 char a[][8] = {{'A','B','C'},{'D','E','F'},{'G','H','I'},{'J','K','L'}}; 07 08 printf("배열 a의 크기 : %d\n",sizeof(a)); 09 printf("배열 a의 시작주소 : %d\n",a); 10 printf("------------------------------\n"); 11 printf("\n"); 12 13 for(i=0;i<4;i++){ 14 printf("a[%d]의 주소 : %d, a[%d]의 크기: %d\n",i,&a[i],i,sizeof(a[i])); 15 printf("\n"); 16 for(j=0;j<8;j++) 17 printf("a[%d][%d]의 주소 : %d, a[%d][%d]의 크기 : %d\n",i,j,&a[i][j],i,j,sizeof(a[i][j])); 18 printf("------------------------------\n"); 19 } 20 return 0; 21 }
위 코드의 06라인만 살펴보겠습니다.
char a[][8] = {{'A','B','C'},{'D','E','F'},{'G','H','I'},{'J','K','L'}};
위 코드에서 배열 선언과 동시에 초기값을 넣어주고 있습니다. 행(배열의 첫 번째 인덱스)의 값은 생략하였지만, 4라는 것을 원소를 보면 알 수 있고, 열( 배열의 두 번째 인덱스)의 값은 8로 지정을 하였지만, 입력 원소들을 확인하면 3개씩만 입력하고 있습니다. 그럼 나머지 5개의 공간은 공백(NULL)이나 쓰레기 값으로 채워집니다.
나머지 코드는 위 코드와 흡사하니 설명을 생략하고, 배열 a의 메모리 할당을 도식화하면 다음과 같습니다.
복잡해 보이지만. 그림을 보면 2차원 배열의 메모리 할당을 쉽게 이해할 수 있습니다.
이제 본문제의 코드를 살펴보겠습니다.
01 #include <stdio.h> 02 int main() 03 { 04 char a[][8] = {“ABC”, “DEF”, “GHI”, “JKL”}; 05 printf(“%s \n”,a[1]); 06 return 0; 07 }
LINE 04 :
2차원 배열 a를 선언과 동시에 초기값을 입력합니다.
하지만, 원소들을 문자(char) 형이 아닌 문자열(string)로 입력하였습니다. C언어에서는 문자열(string) 자료형이 없기 때문에 문자 배열을 사용합니다.
결국 이 코드는 앞서 본 2차원 배열 코드의 06라인과 같은 의미입니다.
char a[][8] = {{'A','B','C'},{'D','E','F'},{'G','H','I'},{'J','K','L'}}; //원소가 문자(char)
=
char a[][8] = {"ABC","DEF","GHI",JKL"};//원소가 문자열(string)
그래서 메모리 배당도 앞서 본 그림과 같습니다.
LINE 05 :
A는 2차원 배열임에도 불구하고, 인덱스가 하나뿐입니다.
보통 문자열을 사용할 때 자주 쓰는 문법입니다. 2차원 배열을 첫 번째 인덱스만 기입하였을 때는, 그 행의 시작 주소를 나타냅니다. 이해를 위해 소스를 살짝 변경해보겠습니다.
01 #include <stdio.h> 02 int main() 03 { 04 char a[][8] = {“ABC”, “DEF”, “GHI”, “JKL”}; 05 printf(“%d\t%d\n”,a[1],&a[1][0]); 06 return 0; 07 }
위 코드의 05라인을 보시면, 변환 문자열 %d를 사용하여 a[1]과 &a[1][0]을 출력하니, 같은 주소 값이 나온다는 것을 확인할 수 있습니다.
%s는 문자열(string)을 출력할 떄 사용되는 변환문자열입니다. %s는 주어진 시작 주소부터, 널값(NULL)을 만날 때까지 출력을 합니다.
다음과 같은 간단한 코드로 확인해 볼 수 있습니다.
01 #include <stdio.h> 02 03 int main() 04 { 05 char a[] = {'a','p','p','l','e'}; 06 char b[] = {'a','p','\0','l','e'}; 07 printf("%s\n",a); 08 printf("%s\n",b); 09 }
위 코드처럼 변환문자열 %s는 배열의 크기와 상관없이, 시작주소부터 연속 할당된 자료를 널값(\0)을 만날때까지 출력하는 메커니즘을 가지고 있습니다.
그래서 본문제의 'printf("%s \n",a[1]);'로 인해 출력 값은 'DEF'라는 것을 알 수 있습니다.
https://youtube.com/playlist?list=PLboXycXmAIDt4ObBRPVj29BuD2d27oRnO
반응형'전자계산기조직응용기사 > 실기 필답형 기출문제 해설' 카테고리의 다른 글