C 포인터 기초...질문 부탁드릴게요

jcs0421의 이미지

char *p = "사랑스러워";
printf("%s %d",p,p);
getchar();
이경우는 사랑스러워 와 4206592가 출력되는데...

4206592가 주소값이라면...(주소값이 맞는가?...) 사랑스러워는 어디 저장되는건가요?
따로 변수에 넣어준거도 없는데...

게다가 printf("%s",*p); 도 안되던데... 이건 왜 안되는가요;;

char p = "사랑스러워";
printf("%s %d",p,p);
getchar();
이경우는 사랑스러워가 출력이 안되고 NULL과 0이 출력이 됩니다.

1바이트 짜리에 11바이트 짜리 문자열을 넣었는데 덮어쓰거나 에러가 나는게 아닌 0이 나오는 이유를 모르겠습니다...

너무 기초적인걸 올려서 죄송합니다.

그리고 제가 혼자 공부하는데... 이런거 알고싶으면 어디가서 공부하는것이 좋은가요... 검색하다가 알게 되서 이곳에 글을 올려봅니다.

kaeri17의 이미지

C에서 문자열 상수 같은 경우 메모리의 프로그램 데이터 영역에 저장됩니다. 읽기만 가능하고요 쓸수는 없습니다. Heap이나 stack같은 영역과 비슷하다고 생각 하시면 됩니다. objdump같은걸로 떠 보시면 대충 p에 주소값 저장하는 문장이 있는 것을 확인 할 수 있으실 겁니다.

jcs0421의 이미지

메모리의 프로그램 데이터 영억이란거군요...
그럼,메모리의 프로그램 데이터 영억은 무한한가요...?
(그런데 Heap이나 stack , objdump가 뭔질 모르겠네요;;하핫)

kkn1380의 이미지

메모리에 여러가지 분류가 있지만 위의 문자열 상수 같은 경우는 님이 작성하신 코드와 같이 text영역에 잡히게 됩니다.
text영역은 이미 더이상 변동이 없을 영역이구요. 코드 자체라고 생각하셔도 될듯 합니다.
그리고 heap같은 경우는 프로그램 실행중에 OS로 부터 할당 받는 부분이고요 C에서는 malloc을 이용하면 힙영역에 할당이 되면
함수내에 선언한 변수 같은 경우에는 stack 영역에 잡히게 되는 것입니다.
둘은 runtime시에 메모리가 할당된다는 점이 같다고 할 수 있겠지만 stack의 경우 함수내에서만 사용되고 함수가 끝나면 선언된 메모리가 계속 유지 되지 않고 heap의 경우 반대라고 생각하시면 됩니다.
예를 들어

func1()
{
char *a = "hello"; -> 포인터 변수 a에 text영역에 할당된 hello의 첫번째 주소값을 넣는다
char a1; -> stack에 잡히고 func1이 끝나는 동시에 할당된 메모리는 사라집니다.
char *a2 = malloc(10) -> heap영역에 10만큼의 사이즈를 잡고 주소를 a2로 넘겨줍니다. 10만큼 잡힌 메모리는 func1()이 끝난 후에도 free를 호출해 주기 전까진 사라지지 않습니다. 하지만 할당된 a2는 사라지니까 해당 메모리주소를 잘 보관해 둬야겠죠? ^^
}

댓글 달기

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