'포인터'에 해당되는 글 4건

  1. 2009/07/24 C에서 특정 주소로 점프하기
  2. 2009/05/25 오묘한 포인터와 배열의 세계 (3)
  3. 2008/10/10 종종 헷갈리는 포인터질 (3)
  4. 2008/03/04 과연 무엇일까? (1)
Engineering/C/C++2009/07/24 13:02

회사에 아는 선임분이 ARM 교육을 가셔서 부트 로더쪽 코딩으로 뭔가를 실습하는데, 잘 모르겠다고 메신저로 물어보시길

"C에서 특정 주소로 점프 하려면 우찌해야 하냐?"

참고로 부트로더의 역할을 내가 아는데로 간단하게 정리를 해보면

1. 뭔가를 한다 -_-   (보통 시리얼 통신(rs-232,)을 통해 커널이미지를 정해진 주소에 다운로드 시키게 된다)
2. 특정 주소(커널 이미지의 시작점)로 점프를 한다.
3. 끝 -_-

역시 .. 내가 아는데로 정리하니 ... 간단하다 -_- . 다시 말해 모르는게 속편하다는 거 ㅋ

아무튼 질문을 받고 내가 처음에 바로 떠올린건 인라인 어셈블리였지만, '어셈은 안돼~' 라는 말에 함수포인터를 써보기로 하였다. 커널(커널함수)의 리턴이나 인자는 없다고 가정하였다. 쉽게 말해 kernel의 코드가 다음과 같은 함수로 선언되어 있다고 한 것이다.  void kernel(void); 고로 요런 함수의 주소에 매핑되는 함수포인터를 사용하여 아래와 같은 코드가 나오게 되었다.


내가 짜놓고도 잘 될려나 하고 반신반의 했었는데, 잘 된다고 한다. ㅋ역시나 C로 못하는 것은 없다. C만세. -_-;


Posted by Humaneer
Engineering/C/C++2009/05/25 15:58

눈컴파일 및 실시간 두뇌 실행을 해봅시다.



거두절미 하고 아래의 소스는 과연 실행이 잘 될까?


당연히 잘 된다. Abc라는 문자열이 화면에 출력된다.



그렇다면 아래의 소스는 실행이 잘 될까? ㅋ


당연히 잘 될까? 컴파일, 링킹까지는 된다. 하지만 실행시 오류가 난다. 즉, 우리 프로그래머들이 가장 싫어하는 Runtime Error(혹은 Segmentation Fault)가 뜬다는 말이다. -_-;



그렇다면 아래의 소스는?


실행된다. abc라는 문자열이 화면에 출력된다.


도대체 뭐가 문제일까?


나도 명확하게는 잘 모르겠다. 위의 사례로 보아 배열로 선언하여 정적으로 할당받은 메모리 영역은 read/write 모두 가능하다. 하지만 포인터로 선언하여 정적으로 할당받은 메모리 영역은 read only이다. 이게 당최 뭐람? ㅋ

게다가 두번째 소스를 visual studio에서 debug mode로 컴파일을 하면 런타임 에러가 뜬다. 그런데 release mode로 컴파일을 하면 런타임 에러가 뜨지 않는다. 그렇다면 debug/release의 선택에 따라 할당하는 메모리의 영역에 차이가 있는 것인가?

정답은 '아니오'이다. release mode로 컴파일 하고 실행하면 에러는 뜨지 않는다. 즉 char* str = "abc"; str[0] = 'A' 또는 *(str + 0) = 'A'를 수행할 때 에러를 내지 않는다는 것이다. 하지만 출력해보면 그 결과가 매우 신기하다. Abc가 아니라 abc가 출력된다는 것. 즉 포인터로 할당한 문자열의 내용을 바꾸는 명령이 반영이 되지 않은 것이다.

그렇다면 결론은 이러한 것인가? ㅋ (내멋데로 결론)
char* str = "ABC"; 이렇게 포인터를 통해 정적으로 할당받은 메모리 영역은 read only이다.(배열은 read/write가능) 또한 debug mode로 컴파일을 하면 포인터를 통해 할당받은 메모리 영역에 쓰기를 시도할 때 런타임 에러를 내지만, release mode로 컴파일을 하면 에러를 내지는 않지만, write하는 명령을 무시한다.

gcc, bcc, turbo c 같은 컴파일러는 어떠한지 궁금하다. 혹시 이 글 보고 해보실 분은 해보시고 결과를 피드백해주시면 매우 감사하겠습니다 ;). 어쨌거나 오묘한 포인터와 배열의 세계. ㅋ

Posted by Humaneer
Engineering/C/C++2008/10/10 11:38
 
종종 헷갈리는 포인터질 -_-;

typedef가 들어가니 더 헷갈린다 훗~

Posted by Humaneer
Engineering/C/C++2008/03/04 14:41
(*(void(*)())0)();
Posted by 비회원