C언어 큰 따옴표 문자열 메모리 관련

유현규의 이미지

#include <stdio.h>

void hello(char** ppstr);

int main()
{
    char* pstr;
    hello(&pstr);

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

void hello(char** ppstr)
{
    *ppstr = "hello";
    printf("%p %s\n", *ppstr, *ppstr);
}

여태 별로 신경 안 쓰고 있었는데 갑자기 궁금해지는군요.
큰 따옴표로 문자열 메모리 할당해서 포인터를 넘겨 받으면
배열로 잡지 않은 이상 힙에 저장될텐데 해제는 언제 되는 거죠?

저 실행 결과는 당연하게도 해제가 되었는지 안 되었는지 알 수 없었습니다.

printf, scanf, fopen 각종 함수에도 인자로 넣는데 말이죠.

kuaaan의 이미지

초기화시에 큰따옴표로 선언된 스트링은

heap이 아니라 code 영역에 잡힌다고 들었습니다만...?

저렇게 선언된 문자열이 const (읽기전용)으로 잡히는 게

그래서 그런거 아닌가요? ... 아닌가? ('' )a e( '')

아마... 저 문자열 잡힌 주소가 hello 함수의 주소 근처일걸요? ^^

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

kuaaan의 이미지

#include <stdio.h>

void hello(char** ppstr);

int main()
{
    char* pstr;
    char* pdyna;
    char plocal[10];

    pstr = "hello";
    printf("address of hello : %p \n", pstr);
    printf("address of func hello : %p\n", hello);

    printf("address of local mem : %p\n", plocal);

    pdyna = (char*)malloc(10);
    printf("address of danymic mem : %p\n", pdyna); 

    strncpy(pstr, " ", 1);/* error!! */

    return 0;
}

void hello(char** ppstr)
{
}

[root@fedora test]# ./a.out
address of hello : 0x8048558
address of func hello : 0x8048472
address of local mem : 0xfef30e50
address of danymic mem : 0x8294008
세그멘테이션 오류
[root@fedora test]#

보시면 pstr 의 주소에 쓰기를 시도하는 순간 세그폴트가 뜨는걸 알수 있슴다.
코드영역에 잡히니 컴파일 시점에서 이미 주소가 정해질 뿐더러...
해제같은것도 되지 않습니다.

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

익명 사용자의 이미지

큰 따옴표로 둘러싸인 문자열을 문자열 상수라 부르며, 수정 불가능한 char형 배열로 취급됩니다.

문자열 상수의 할당과 해제는 컴파일러가 알아서 할 일이지만, 대체로 프로그램이 실행되는 동안 항상 존재한다고 보시면 됩니다.

댓글 달기

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