[완료]포인터 변수에 상수 할당

harion01의 이미지

포인터에대한 이해를 다지기 위해 테스트 코드를 짜면서 공부하고있었습니다. 그런데 안된다고 생각했던 코드가 작동되군요,

코드는 아래와 같습니다.

#include
#include
#include

int main()
{
int *test;
printf(" normal : [%p]\n",test);

test = 5555;
printf(" 5555 : [%d]\n",test);

test = "a";
printf(" a : [%s]\n",test);

test = "abcde";
printf("abcde : [%s]\n",test);

exit(0);
}

코딩 환경은 리눅스 centOS 에서 gcc 로 컴파일 했습니다. 컴파일에서 워닝이 뜨긴 합니다.

gcc -Wall -o basic basic.c

basic.c: In function 'main':
basic.c:10: warning: assignment makes pointer from integer without a cast
basic.c:11: warning: format '%d' expects type 'int', but argument 2 has type 'int *'
basic.c:13: warning: assignment from incompatible pointer type
basic.c:14: warning: format '%s' expects type 'char *', but argument 2 has type 'int *'
basic.c:16: warning: assignment from incompatible pointer type
basic.c:17: warning: format '%s' expects type 'char *', but argument 2 has type 'int *'

에러는 없어서 실행파일 이 나오길래 실행해봤습니다.

./basic

normal : [0x6255c0]
5555 : [5555]
a : [a]
abcde : [abcde]

이게 어떻게 출력이 가능한거죠?

제가 생각하기로는,
1. int 형 포인터 변수 test 를 선언함으로써 memory 에 4byte 의 공간이 잡히고, test 는 그 공간의 주소를 가짐
2. 최초 출력 - 메모리 공간에 있는 쓰레기값 출력
2. test 가 가르키는 공간에 5555 숫자를 집어넣음
3. 2번째 출력 - 메모리 공간에 들어간 5555 숫자 출력됨
4. test 메모리 공간에 "a" 라는 string 집어넣음
5. 메모리 공간 안에 있는 상수 출력
6. test 메모리 공간에 "abcde"라는 string 집어넣음
7. 메모리 공간은 4인데 abcde 는 4보다 크니까 오버플로우가 일어나야 하는데 그대로 출력됨?????

정확히 메모리 제어를 해서 나중에 string 처리할 때 문제가 안생기게 하고싶은데 대충 코딩되서 실행되는것 처럼 보이니까 더 큰문제가 생기네요.

이게 어떤과정을 거쳐서 실행이 되는거죠?

jick의 이미지

(32비트 머신 기준으로) test를 정의해서 4바이트의 공간이 생기는 건 맞지만 test가 그 공간의 주소를 가지는 건 아닙니다. 그 공간이 test의 값을 (즉, test가 앞으로 다른 주소를 가리키게 되면 그 주소를) 넣는 공간으로 쓰이는 겁니다.

test = "abcde"는 test가 가리키는 공간에 스트링을 집어넣는 게 아니라 프로그램 데이터 영역에 ("abcde" + 마지막 널문자) = 6바이트짜리 공간이 있고, test가 이 공간의 시작주소(='a'가 있는 위치)를 가리키게 되는 겁니다.

전혀 아무런 overflow가 일어나지 않습니다.

* 게다가 왜 문자열 상수를 char *가 아닌 int *에 대입하고 계신 겁니까;;;

harion01의 이미지

작업하는데 저런식으로 다른 형에 막 들어가길래 테스트 겸 해서 이런저런 상황을 가정하고 다 해보고있었습니다.

어쨋든 포인터와 주소에대해 좀더 배울수있었네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.