2011년4월18일..포인터복습, 포인터변수의 자료형, 잘못된 자료형을 가리키는 포인터 변수
1. 20110418_point/test.c
주소 | 100번지 | 101 | 102 | 103 | 104 | 105 | 106 |
값 | 0x74 | 0x56 | 0xAB | 0x64 | 0x12 | 0x70 | 0x82 |
메모리에 상기와 같이 값이 들어가 있어도 프로그래머가 의미를 부여하지 않은 쓰레기값들이다.
상기의 소스를 보면 포인터 변수p를 %d 형식지정자로 출력하는 것을 볼 수 있는데 * (Asterisk)를 붙이지 않으면 포인터 변수도 일반 변수와 같이 값을 저장하는 것은 다르지 않다. (부호없는 정수형 4Byte로 정해져 있음)
13행은 메모리 테이블의 103번지에 있는 0x64를 읽어와 10진수로 출력하니 100이 출력되고,
14,15행은 A와 p에는 각 103이 들어 있으니 그대로 출력된다.
16행은 A는 포인터변수가 아니므로 A앞에 * (Asterisk)가 단항연산자인 포인터가 아닌 다항 연산자인 곱셈으로 간주한다.
그러니 컴파일러는 다음과 같은 에러를 낸다.
symbol table을 그려보면,
type | name |
int | A |
char * | p |
A는 int형 변수이고 p는 포인터변수이다.
p = 103; -> 컴파일러가 아래와 같은 불만메세지를 표시하며 캐스팅해준다. (캐스팅하지 않으면 대입불가)
(char *) (int)
주소(정수) 정수 -> 둘 다 정수란 것은 같으니 error가 아닌 warning
경고메세지를 없애기 위해 아래와 같이 하면,
p = (char *) 103; -> 형이 동등하므로 컴파일러는 아무 불만 없이 대입시켜줌.
short *sp;
sp = (short *) 103;
★어느 땅에 건물을 짓는냐에 따라 가치가 달라진다.
★103번지는 보호영역…4G의 메모리 중 우리가 사용하는 영역은 얼마 안 된다. (나머지는 우리에겐 쓰레기값)
2.포인터 변수가 가리키는 자료형의 의미 (예제 5-4)
symbol table을 그려보면,
type | name | address |
int | iNum | 0xBFFFF848 |
int * | ip | 0xBFFFF844 |
short * | sp | 0xBFFFF840 |
각 명령 실행 후 값들을 정리하여 보면,
시간 | 명령 | iNum | ip | *ip | sp | *sp |
1 | iNum = 0x0F5A0B43; | 0x0F5A0B43 | 쓰레기값 | 쓰레기값 | 쓰레기값 | 쓰레기값 |
2 | ip = &iNum; | 0x0F5A0B43 | 0xBFFFF848 | 0x0F5A0B43 | 쓰레기값 | 쓰레기값 |
3 | sp = (short *) ip; | 0x0F5A0B43 | 0xBFFFF848 | 0x0F5A0B43 | 0xBFFFF848 | 0x0B43 |
4 | sp++; | 0x0F5A0B43 | 0xBFFFF848 | 0x0F5A0B43 | 0xBFFFF84A | 0x0F5A |
5 | ip = ip + 1; | 0x0F5A0B43 | 0xBFFFF84C | 쓰레기값 | 0xBFFFF84A | 0x0F5A |
6 | ip = ip + 1; | 0x0F5A0B43 | 0xBFFFF850 | 쓰레기값 | 0xBFFFF84A | 0x0F5A |
7 | ip = ip + 1; | 0x0F5A0B43 | 0xBFFFF854 | 쓰레기값 | 0xBFFFF84A | 0x0F5A |
sp = sp + 1과 같이 포인터변수의 증감은 포인터변수가 가리키는 자료형의 크기에 증감값을 곱하여 계산한다.
즉, sp = sp + 1은 sp의 주소가 +2가 되는 것이다. int형인 ip++;은 ip의 주소 +4가 됨.
상기의 표에 있는 값들은 모두 화면에 출력되는 순서(Big Endian)이고, 실제 메모리에 저장되는 순서(Little Endian)으로 바꾸면..
3번째 *sp의 값은 메모리상 0xBFFFF848번지의 0x43, 다음 0xBFFFF849번지의 0x0B 이렇게 저장이 된다.
2번째 *ip의 값은 메모리상 0xBFFFF848번지의 0x43, 0xBFFFF849번지의 0x0B, 0xBFFFF84A번지의 0x5A, 0xBFFFF84B번지의 0x0F 이렇게..
메모리에 저장이 된다.
★UNIX날리기
# rm –rf / * -> 지우기 묻지마 지우기힘든 것도 모든 파일
★오늘 할 일을 내일로 미루지 말자.
조금 투자해도 될 일들이 모이면(쌓이면) 천문학적인 금액이 되고, 비난을 받게 된다. (농협 보안 문제)
3. 범용컴퓨터와 마이크로컨트롤러의 차이
범용컴퓨터의 CPU와 임베디드 시스템용 CPU는 구조가 달라 프로그래밍 방식이 다르다.
PC의 경우 CPU와 메모리가 분리되어 있고 메인보드의 슬롯에 꽂아 확장이 용이하게 되어 있다.
CPU내부의 레지스터는 C언어로 엑세스가 불가능하나 기계어와 가까운 어셈블리어는 가능하다.
반면, ATMEGA128과 같은 AVR MCU는 레지스터가 CPU밖에 위치해 C언어로 엑세스가 가능하다.
그리고 범용컴퓨터에 비해 상대적으로 적은 용량의 메모리가 내부에 있어 간단한 응용에 적합하다.
내부에 RAM이 있으니 외부에 RAM을 달았을 때 보다 외부 잡음에 대한 영향을 적게 받아 오동작의 가능성이 낮다.
현실적을 chip의 크기에는 제한이 있으므로 범용컴퓨터의 CPU내부에 RAM을 집어 넣는 것은 어렵다.
앞으로 기술이 발달하면 하나의 chip으로 모든 것을 다하는 세상이 올지 모른다. (SoC)
4. 잘 못된 자료형을 가리키는 포인터 변수 (예제5-5)
(설명)
5. 포인터 변수가 초기화 되지 않고 사용되었을 때 (예제5-6)
(세그멘테이션 설명)
6. ATMEGA128들어가기 전에 CPU구조 조사
마인드스톰에서 사용한 센서들은…
1.빛
2.초음파
3.사운드
4.터치
사용된 출력은..
1.모터
2.스피커
이 모든 것의 하드웨어를 모르고 사용하였다. 이제는 직접해보자?
폰 노이만/ 하바드 구조와 RISC와 CISC조사…
ATMEGA128은 어디에 해당되는가?
'내장형하드웨어 > 일일보고서' 카테고리의 다른 글
2011년4월19일..CPU와 메모리간의 데이터전송, 주소값연산, 함수의 특징/원형, DK-128 AVR MCU Board (0) | 2011.04.20 |
---|---|
2011년4월15일..마인드스톰 자유과제 발표 (2) | 2011.04.19 |
2011년4월15일..포인터복습, 정수와 실수의 바이트 순서(Big/little Endian) (0) | 2011.04.18 |
2011년4월14일..다중 제어문, 구구단, 포인터 (0) | 2011.04.15 |
2011년4월13일..for문에서 초기식과 증감식의 변형, gdb(GNU Debugger), 무한반복문, 마인드스톰 자동차 개조 (0) | 2011.04.14 |