포인터 질문입니다.

kernelbomb의 이미지

음... 포인터 다 잊어 먹은거 같네요. ㅜㅜ;

다름이 아니오라 아래와 같은 코드에서 출력이 ab로 나와야 하는것

아닌가요? a만 출력되니... 친구넘이 한 번 맞춰 보라고 해서 해봤는데

많이 헷갈리네요. ㅜㅜ;

int main(void)
{
    int *p = (int *)malloc(3 * sizeof(int));

    *p = 'a';
    *(p + 1) = 'b';
    *(p + 2) = 0;

    printf("%s\n", p);
    return 0;
}
ktd2004의 이미지

sizeof(int)는 2 ~ 4bytes를 가집니다.
따라서 int *는 2혹은 4씩 증가하겠죠.
거기다가 1byte의 char를 넣으면
a NULL b NULL NULL NULL 같은식으로 메모리에 들어가겠죠.
그걸 printf하니까 당연히 a만 출력되겠죠. ^^;

cdpark의 이미지

x86 cpu니깐 그나마 a라도 찍힌겁니다. :)

lunarainbow의 이미지

kernelbomb wrote:
음... 포인터 다 잊어 먹은거 같네요. ㅜㅜ;

다름이 아니오라 아래와 같은 코드에서 출력이 ab로 나와야 하는것

아닌가요? a만 출력되니... 친구넘이 한 번 맞춰 보라고 해서 해봤는데

많이 헷갈리네요. ㅜㅜ;

int main(void)
{
    int *p = (int *)malloc(3 * sizeof(int));

    *p = 'a';
    *(p + 1) = 'b';
    *(p + 2) = 0;

    printf("%s\n", p);
    return 0;
}

4byte 단위로 끊어서 설명해 볼께요.

먼서 int로 sizeof 했구, (int*)로 케스팅 했으니깐,

0000 0000 0000

이만큼 할당 됐겠죠?

*p 는 저중 처음 4바이트 가르킬 테니깐..

'a'000 0000 0000

이 될테구,

*(p+1) 은 두번째 4바이트를 가르킬 테니깐..

'a'000 'b'000 0000

*(p+2) 는 굳이 안해두 되겠네요.

p를 출력했으니깐..

그런데 저걸 스트링형으로 출력을 하니깐..

'a' 하나 출력한 후에 0이니깐... '\0'으로 알고 끝난 스토리..

이렇게 바꾸시면 ab 다 출력될 것입니다.

        *p = (int)'a';
        *((char*)p+1) = 'b';
        *((char*)p+2) = 0;

친구분이 약간의 장난( ? )을 치셨군요. :wink:

char* 을 int* 살~짝 바꿔서 헷갈리게..

happibum의 이미지

int main(void) 
{ 
  int p[2];

  p[0] = 0x41424344;
  p[1] = 0;
  printf("%s\n", p); 
  return 0; 
}

결과
DCBA

a가 왜 처음에 들어가는지 몰랐는데 int는 byte단위로 끊어 거꾸로 집어 넣네요.
위에 x86이라 a만이라도 찍혔다는건 이걸두고 하신 말씀이었군요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.