개요
프로그래밍 언어 : C언어
과제 수행 날짜 : 2020.09.18
과제 개요 : 각종 출력 프로그램을 구현하고, 그 프로그램에서 사용된 변수들의 공간을 확인
1. 구구단 출력
1) 코드
int main()
{
char a, b;
for( a = 1; a <= 9; a++)
{
printf("\n");
for(b = 3; b <= 6; b++)
{
printf("%d x %d = %2d ", b, a, b*a);
}
}
return 0;
}
2) 변수 공간
- 각 변수의 실제 주소 값과 상대 주소값
변수 a의 실제 주소값 | 0x00affcab | 변수 a의 상대 주소값 | 12 |
변수 b의 실제 주소값 | 0x00affc9f | 변수 b의 상대 주소값 | 0 |
변수들이 관리되는 총공간은 13바이트이다. 변수들은 char 형식으로 크기가 1바이트이고, 변수 a는 12번지부터 1바이트, 변수 b는 0번지부터 1바이트 필요하므로 총 13바이트가 필요하다.
필요한 총 변수 공간에서 실제 변수가 차지한 공간은 2바이트이고, 빈 공간이 차지한 부분은 11바이트이다.
2. #과 0으로 된 사각형 출력
1) 코드
int main()
{
int a = 8;
int b = 10;
if(a > b) //a가 더 크다면 a만큼의 가로줄을 갖도록 출력
{
for(int i = 0; i < a; i++)
{
printf("\n");
for(int j = 0; j< b; j++)
{
if(i == 0 || i == a-1 || j == 0|| j == b-1) //테두리에만 #이 출력되도록
{
printf("#");
}
else //테두리가 아닌 부분은 0으로 출력
{
printf("0");
}
}
}
}
else //b가 더 크다면 b만큼의 가로줄을 갖도록 출력
{
for(int i = 0; i < b; i++)
{
printf("\n");
for(int j = 0; j < a; j++)
{
if(i == 0 || i == b-1 || j == 0 || j == a-1) //테두리에만 #이 출력되도록
{
printf("#");
}
else //테두리가 아닌 부분은 0으로 출력
{
printf("0");
}
}
}
}
return 0;
}
2) 변수 공간
- 각 변수의 실제 주소 값과 상대 주소값
변수 a의 실제 주소값 | 0x0116f9e8 | 변수 a의 상대 주소값 | 12 |
변수 b의 실제 주소값 | 0x0116f9dc | 변수 b의 상대 주소값 | 0 |
변수들이 관리되는 총공간은 16바이트이다. 변수들은 int 형식으로 크기가 4바이트이고, 변수 a는 12번지부터 4바이트, 변수 b는 0번지부터 4바이트 필요하므로 총 16바이트가 필요하다.
필요한 총 변수 공간에서 실제 변수가 차지한 공간은 8바이트이고, 빈 공간은 8바이트이다.
3) 결과
2개의 변수 중 더 큰 변수로 가로줄을 만들어야 하므로, 먼저 어떤 변수가 큰지 비교한다. 비교한 결과 더 큰 변수로 바깥 for loop를 만들어서 해당 변수의 크기만큼 가로줄을 출력하도록 한다. 그리고 안쪽 for loop는 더 작은 변수만큼 돌아서 세로줄을 출력한다. 테두리 부분에는 #을 출력해야 하므로, 가로 세로의 첫 번째와 마지막 줄만 #을 출력하도록 하고, 그렇지 않은 부분에는 0을 출력하도록 한다.
3. int형 변수 중 주소 값이 가장 작은 변수의 값에 1을 더하여 출력
1) 코드
#include <stdio.h>
int main()
{
int a = 30, b = 20, c = 30, d = 10;
int *smallest = &a;
for (int i = 0; i < 3; i++)
{
if (smallest > &a)
{
smallest = &a;
}
else if (smallest > &b)
{
smallest = &b;
}
else if (smallest > &c)
{
smallest = &c;
}
else if (smallest > &d)
{
smallest = &d;
}
}
*smallest = *smallest + 1;
printf("%d %d %d %d", a, b, c, d);
return 0;
}
2) 변수 공간
- 각 변수의 실제 주소 값과 상대 주소값
변수 a의 실제 주소값 | 0x00b8fb10 | 변수 a의 상대 주소값 | 36 |
변수 b의 실제 주소값 | 0x00b8fb04 | 변수 b의 상대 주소값 | 24 |
변수 c의 실제 주소값 | 0x00b8faf8 | 변수 c의 상대 주소값 | 12 |
변수 d의 실제 주소값 | 0x00b8faec | 변수 d의 상대 주소값 | 0 |
변수들이 관리되는 총공간은 40바이트이다. 변수들은 int 형식으로 크기가 4바이트이고, 변수 a는 36번지부터 4바이트, 변수 b는 24번지부터 4바이트, 변수 c는 12번지부터 4바이트, 변수 d는 0번지부터 4바이트 필요하므로 총 40바이트가 필요하다.
필요한 총 변수 공간에서 실제 변수가 차지한 공간은 16바이트이고, 빈 공간이 차지한 부분은 24바이트이다.
3) 결과
가장 작은 주소를 저장할 smallest를 선언하고, for 문을 돌면서 모든 변수의 주소를 비교하여 가장 작은 주소를 smallest에 저장한다. for 문을 끝내면 가장 작은 주소가 smallest에 저장되어 있으므로, 그 주소의 변숫값에 1을 더하여 출력한다. 선언된 4개의 변수는 int형 지역변수로, 각각 4바이트를 차지하고, 중간에 8바이트의 빈 공간이 할당됨을 알 수 있다. 지역 변수는 stack에 저장되게 되는데, 따라서 프로그램 상에서 가장 먼저 선언했던 a가 가장 큰 주소 값을 갖고, 가장 나중에 선언했던 d가 가장 작은 주소값을 갖는다. 그 결과로 변수 d에 1을 더해서 출력한다.
4. 배열의 변수 중 주소 값이 가장 작은 변수의 값에 1을 더하여 출력
1) 코드
#include <stdio.h>
int main()
{
int data[4] = { 10, 20, 30, 40 };
int *smallest = &data[0];
for (int i = 0; i < 4; i++)
{
if (smallest > &data[i])
{
smallest = &data[i];
}
}
*smallest = *smallest + 1;
printf("%d %d %d %d", data[0], data[1], data[2], data[3]);
return 0;
}
2) 변수 공간
- 각 변수의 실제 주소 값과 상대 주소값
data[0]의 실제 주소값 | 0x010ff77c | data[0]의 상대 주소값 | 0 |
data[1]의 실제 주소값 | 0x010ff780 | data[1]의 상대 주소값 | 4 |
data[2]의 실제 주소값 | 0x010ff784 | data[2]의 상대 주소값 | 8 |
data[3]의 실제 주소값 | 0x010ff788 | data[3]의 상대 주소값 | 12 |
변수들이 관리되는 총공간은 16바이트이다. 변수들은 int 형식으로 크기가 4바이트이고, 4개의 변수들이 4바이트만큼의 크기로 빈 공간 없이 할당되어있으므로 총 16바이트가 필요하다.
필요한 총 변수 공간에서 실제 변수가 차지한 공간은 16바이트이고, 빈 공간이 차지한 부분은 0바이트이다.
3) 결과
가장 작은 주소를 저장한 smallest를 선언하고, 일단 data [0]의 주소를 초기값으로 설정한다. for문을 돌면서 배열의 모든 요소의 주소를 비교하여 가장 작은 주소를 smallest에 저장한다. smallest에 저장되어 있는 주소의 변숫값에 1을 더하여 출력한다.
int형 배열로 선언했기 때문에 앞서 했던 프로그램과 비교했을 때, int형 변수 4개가 생성되어 총 변수 공간이 16바이트가 된다는 공통점이 있지만, 배열이기 때문에 배열의 요소들 사이에 빈 공간이 할당되지 않는다는 차이점이 있다. 또한 지역변수로 선언했을 때는 나중에 선언한 변수가 가장 작은 주소 값을 갖지만 배열의 경우에는 배열의 첫 번째 요소가 가장 작은 주소를 갖게 된다. 따라서 data [0]의 값에 1을 더하여 11을 출력한다.
'프로젝트 & 과제 > 3학년' 카테고리의 다른 글
[C언어] 2차원 배열의 주소 (0) | 2022.01.27 |
---|---|
[C언어] 비트 연산 (0) | 2022.01.26 |
[C언어] 한글 / 영어 / 숫자 / 특수문자 (0) | 2022.01.24 |
[C언어] 변수의 메모리 할당 위치 (0) | 2022.01.23 |
[센서] Lane detection (0) | 2022.01.22 |