기초적인 질문입니다.

leolo의 이미지

#include <stdio.h>
int main()
{
char *p = "string";
char *q = &"string"[0];

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

다음 코드의 결과는
p string, q string 입니다.

char a[10] = "leolo";
char *x = &"leolo"[0];
printf("x %s, a %s", x, a);

의 결과도 x leolo, a leolo 입니다.

정확한 이유가 무엇인지 궁금합니다.
즉, 메모리의 정확한 구조를 알고 싶습니다.

또한,
char *p = "string";
char a[10] = "leolo";

의 메모리 영역이 어떤지 부터 설명 부탁드립니다.
heap, stack, static 영역으로 구분부탁드립니다.

세벌의 이미지

이게 무슨 기초적인 질문입니까? 어쩐지 답변이 하나도 없더니만...
제목을 좀더 구체적으로 쓰셨으면 좋겠습니다.
기초적인 질문에 대답할 능력도 안 되는 저는 기초적인 지식도 없는 사람이었군요. -.-

yeppiguy의 이미지

변수를 전부 전역변수로 잡아서 새로 컴파일 한 후,
objdump --syms --disassemble-all a.out > a.dump
하셔서 dump파일에서 전역변수들이 어떻게 잡혀있는지 보세요...

님이 궁금하신게 문자열 주소와 저장형태라면요....^^

moonzoo의 이미지

Quote:
char a[10] = "leolo";
char *x = &"leolo"[0];
printf("x %s, a %s", x, a);

의 결과도 x leolo, a leolo 입니다.

정확한 이유가 무엇인지 궁금합니다.
즉, 메모리의 정확한 구조를 알고 싶습니다.

위와 같은 결과가 나오는 이유는 메모리의 구조로 인한 것이 아닙니다.

배열의 처리의 방식에 기인한 것입니다.

예를 들어 배열 a[0]는 *(a+0)으로 처리됩니다.

마찬가지로 0[a] 라고 하여도 *(0+a) 이기 때문에 위와 같은 결과가 돼죠.

이와 같은 이유로 &"leolo"[0]; 의 처리는

&( *("leolo" + 0)) 으로 처리되는데 이는 "leolo"에서 0번째 떨어진 주소,즉

"leolo"의 주소 그대로 입니다.

그러므로

char *x = &"leolo"[0]; 에서 x에는 "leolo"의 주소값이 들어가게 됩니다.

leolo의 이미지

sebul wrote:
이게 무슨 기초적인 질문입니까? 어쩐지 답변이 하나도 없더니만...
제목을 좀더 구체적으로 쓰셨으면 좋겠습니다.
기초적인 질문에 대답할 능력도 안 되는 저는 기초적인 지식도 없는 사람이었군요. -.-

달리 뜻은 없습니다. 여기 게시판에 글은 하나도 모르는 내용만 있어서..
포인터나 배열은 기초적인 질문으로 생각이 들어서 그냥.. 그렇게 올린것입니다.
죄송해요..

실력이 있으면 삶이 편하다... 영차 영차...

lsj0713의 이미지

leolo wrote:
#include <stdio.h>
int main()
{
char *p = "string";
char *q = &"string"[0];

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

다음 코드의 결과는
p string, q string 입니다.

char a[10] = "leolo";
char *x = &"leolo"[0];
printf("x %s, a %s", x, a);

의 결과도 x leolo, a leolo 입니다.

정확한 이유가 무엇인지 궁금합니다.
즉, 메모리의 정확한 구조를 알고 싶습니다.

사실 문자열 상수는 그것과 동일한 내용이 담긴 문자형 배열과 동일한 결과값을 가진다고 할 수 있습니다.

char *s = "abcde"; 

/* 위의 코드는 아래의 코드와 동일합니다. */

char tmp[6] = "abcde"; /* 단, 이 tmp는 정적 기억 수명을 갖습니다! */
char *s = tmp;

/* 따라서, 아래의 두 줄은 동일한 의미를 갖습니다. */
char *p = "string";
/* 배열은  & 연산자의 피연산자, sizeof 연산자의 피연산자,
char형 배열의 초기화에 쓰일 때를 제외하고는 늘 그 첫번째
원소를 가리키는 포인터 주소값으로 자동 변환됩니다. "string"는
그 내용이 담긴 정적 기억수명의 char형 배열과 동일한 결과값을
가지므로, 여기서는 s를 가리키는 char*형 주소값으로 변환됩니다. */
char *q = &"string"[0];
/* 여기서 "string"는 연산자의 결합 우선순위에 따라 [0]과 먼저 결합됩니다.
즉 &"string"[0]은 &*("string" + 0)과 동일한 결과값을 가지게 됩니다.
"string"는 char형 배열의 첫번째 원소를 가리키는 char*형의 주소값으로
변환되므로... 결국 &*("string" + 0)은 "string"과 동일한 결과를 가지며
그 결과값의 타입은 char*형의 주소값입니다.
*/

leolo wrote:

또한,
char *p = "string";
char a[10] = "leolo";

의 메모리 영역이 어떤지 부터 설명 부탁드립니다.
heap, stack, static 영역으로 구분부탁드립니다.

저는 heap, stack, static 같은 구분에 대해서는 잘 모르겠습니다만... "string"는 문자열 상수string literal에 해당하는 토큰이므로 정적 기억수명을 갖는 char형 배열로 저장되어야 합니다. 정확한 이름은 기억이 안나는데, 리눅스에서는 이런 문자열 상수를 저장하는 메모리 공간이 따로 있었던 걸로 기억합니다(이름을 봐서는 static 영역에 저장될 듯도 싶군요). "leolo"는 char형 배열의 초기화에 쓰이는 문자열 상수이므로 위에서 보인 예에서처럼 첫번째 원소를 가리키는 주소값으로 변환되지는 않습니다. char형 배열의 초기화에 쓰이는 문자열 상수는 그냥 배열 안에 그 자신의 내용을 복사하는 역할밖에는 하지 않습니다. 따라서 "leolo"(정확히는 char a[10])는 아마도 배열이 할당되는 영역인 stack 영역에 저장될 것 같습니다. (물론 이건 항상 그렇게 되도록 요구되는 사항은 아닙니다. 무엇보다 C언어 표준문서에는 stack 영역, heap 영역이라는 개념이 나오지 않습니다.)

그리고, 이 질문은 별로 비난받을만한 질문이 아닌 것 같습니다만... 물론 제목을 '기초적인 질문입니다'라고 하기보다는 'C의 포인터에 대한 질문입니다' 혹은 'C에서 문자열 상수의 할당영역에 대한 질문입니다'라고 구체적으로 적었다면 좋았을 테지만요. 너무 예민하게 반응하시는 것 같습니다.

댓글 달기

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