포인터질문..

익명 사용자의 이미지

char* a = "aaaa";
가..왜 문제가 되나요?...
음...
따옴표로 문자열을 싸면...그안의 내용으로 메모리에
하나 만들어다가 그 시작주소를 리턴한다고 생각을했었는데..
아무래도 잘못된 생각같군요..

char* a = malloc(5);
a = "12345";
하면..malloc이 메모리에서 5바이트짜리의 연속된...
저장공간을 보장(?)해준다고 생각했는데..
strcpy( a, "12345" );
도 아니구..
단순히 a = "12345";
하면 아예 malloc로 할당한 주소가 바뀔거라 생각했거든요..
a = "12345"가 strcpy를 의미하는건 아닐테구..
암튼 평소에는 신경쓰지않다가
갑자기..궁금증이 생기네요..
따옴표의 의미라할까..

익명 사용자의 이미지

char a[]="aaaa"; 에서 "aaaa"는 C에서 컴파일되면
DATA영역에 들어갑니다. 프로그램 수행이전에 DATA영역에 결정되어
있는 값이지요. 반면에 malloc으로 메모리를 할당하는 포인터는
메모리를 할당하면 heap영역에 자리하게 됩니다.
DATA영역과 HEAP영역의 차이점을 아시면 쉽게 이해하실 수 있으리라 봅니
다.

익명 사용자의 이미지

다음 글과 답글들을 참고 하세요.
=c&o[ss]=%C1%F6%B3%AA%B0%A1%B4%D9&o[st]=a&o[at]=s&o[sct]=s&o[stt]=s">
http//kldp.org/script/bbs/read.php?table=qa2&no=3638&o[sc]=c&o[ss]=%
C1%F6%B3%AA%B0%A1%B4%D9&o[st]=a&o[at]=s&o[sct]=s&o[stt]=s

그리고,
aero님의 말씀과는 달리
char *a = "aaaa";
하면 "aaaa"는 code 영역으로 들어 갑니다.
때문에 a의 내용을 나중에 수정하려하면 에러가 나겠지요.
code 영역은 read-only니까요.
그럼..

이석 wrote..
char* a = "aaaa";
가..왜 문제가 되나요?...
음...
따옴표로 문자열을 싸면...그안의 내용으로 메모리에
하나 만들어다가 그 시작주소를 리턴한다고 생각을했었는데..
아무래도 잘못된 생각같군요..

char* a = malloc(5);
a = "12345";
하면..malloc이 메모리에서 5바이트짜리의 연속된...
저장공간을 보장(?)해준다고 생각했는데..
strcpy( a, "12345" );
도 아니구..
단순히 a = "12345";
하면 아예 malloc로 할당한 주소가 바뀔거라 생각했거든요..
a = "12345"가 strcpy를 의미하는건 아닐테구..
암튼 평소에는 신경쓰지않다가
갑자기..궁금증이 생기네요..
따옴표의 의미라할까..

익명 사용자의 이미지

이석 wrote..
char* a = "aaaa";
가..왜 문제가 되나요?...

=>ㅡㅡ;; 문제 없습니다.

음...
따옴표로 문자열을 싸면...그안의 내용으로 메모리에
하나 만들어다가 그 시작주소를 리턴한다고 생각을했었는데..
아무래도 잘못된 생각같군요..

=> ㅡㅡ;; 잘못된 생각 맞습니다.


char* a = malloc(5);
a = "12345";
하면..malloc이 메모리에서 5바이트짜리의 연속된...
저장공간을 보장(?)해준다고 생각했는데..

=> 역시 님의 생각이 맞습니다.

strcpy( a, "12345" );
도 아니구..
단순히 a = "12345";
하면 아예 malloc로 할당한 주소가 바뀔거라 생각했거든요..

=> 이또한 님의 생각 맞습니다.

a = "12345"가 strcpy를 의미하는건 아닐테구..

=> 잘아시네요..

암튼 평소에는 신경쓰지않다가
갑자기..궁금증이 생기네요..
따옴표의 의미라할까..

=> ㅡㅡ;; 도대체 뭘 모른단 말씀이죠?? 다아시네요...ㅡㅡ;;

익명 사용자의 이미지

>char* a = "aaaa";
>가..왜 문제가 되나요?...

올바른 식입니다. 그이유는 다음과 같습니다.

"aaaa"는 할당식에서 오른쪽 위치에서 사용될 경우,
"aaaa"라는 문자열의 첫번째 주소값으로 취급되어 할당됩니다.

>음...
>따옴표로 문자열을 싸면...그안의 내용으로 메모리에
>하나 만들어다가 그 시작주소를 리턴한다고 생각을했었는데..
>아무래도 잘못된 생각같군요..

올바로 알고 계십니다. 위에 설명한 내용 그대로입니다.

>char* a = malloc(5);
>a = "12345";

char * a = malloc(6);
이라고 해야 합니다. '\0'을 계산하지 않으셨습니다.
그런데 OP께서 char * 형 변수 a에 메모리를 할당한 상태에서
a에 할당연산자 = 을 사용하여 바로 문자열을 할당하는 방식으로
코딩하시면 잘못된 코드입니다.
위의 경우 malloc()을 사용하지 않으셔도 됩니다.

char *a;
a = "12345";

라고 하셔야 합니다 .

>하면..malloc이 메모리에서 5바이트짜리의 연속된...
>저장공간을 보장(?)해준다고 생각했는데..
>strcpy( a, "12345" );
>도 아니구..
>단순히 a = "12345";
>하면 아예 malloc로 할당한 주소가 바뀔거라 생각했거든요..
최초로 malloc으로 할당된 주소는 바뀌지 않습니다.

>a = "12345"가 strcpy를 의미하는건 아닐테구..
전혀 다릅니다.

>튼 평소에는 신경쓰지않다가
>자기..궁금증이 생기네요..
>옴표의 의미라할까..

익명 사용자의 이미지

> 따옴표로 문자열을 싸면...그안의 내용으로 메모리에 > 하나 만들어다가 그 시작주소를 리턴한다고 생각을했었는데.. > 아무래도 잘못된 생각같군요.. >=> ㅡㅡ;; 잘못된 생각 맞습니다.

님께서 잘못알고 계십니다.
char *a;
a = "aaaa"

"aaaa"는 문자열의 첫번째 주소번지를 가리키는 주소값으로 취급되어 할당
됩니다.
즉, 따옴표로 싸여진 문자열은 할당식에 사용될 경우 문자열의 첫번째 주
소번지로 취급되어 집니다.

> char* a = malloc(5);
> a = "12345";
> 하면..malloc이 메모리에서 5바이트짜리의 연속된...
> 저장공간을 보장(?)해준다고 생각했는데..
>=> 역시 님의 생각이 맞습니다.

^^ 위의 식은 잘못된 것입니다.

> strcpy( a, "12345" );
> 도 아니구..
malloc으로 할당한 크기와 "12345"의 크기가 다르군요. ^^

> 단순히 a = "12345";
> 하면 아예 malloc로 할당한 주소가 바뀔거라 생각했거든요..
> => 이또한 님의 생각 맞습니다.

질문자 답변자 모두 틀립니다.
첫부분의 답변처럼,
따옴표에 싸여진 문자열은 문자열의 첫번째 주소번지의 값으로 취급되어집
니다.
하기에

char *a = malloc(6);
/*편의상 a에 주소번지 100부터 시작하여 105까지의 6byte가 할당된다고
가정합니다. */

a = "12345";
따옴표에 싸여진 문자열은 문자열의 첫번째 주소번지의 값으로 취급되어집
니다.
편의상 문자열의 첫번째 주소번지를 200이라 가정합니다 .
결국 char *타입의 a에 저장된 주소번지의 값이 100이었다가, 할당식에 의
해 200으로 변한 것에 불과합니다.

익명 사용자의 이미지

> char* a = malloc(5);
> a = "12345";
> 하면..malloc이 메모리에서 5바이트짜리의 연속된...
> 저장공간을 보장(?)해준다고 생각했는데..
>=> 역시 님의 생각이 맞습니다.

^^ 위의 식은 잘못된 것입니다.

음.. 위의 식이 어떻게 잘못된건지 궁금합니다.
제생각에는 틀릴게 없어 보이거든요..

익명 사용자의 이미지

char* a = malloc(5);
a = "12345";

sytax error는 없으나 free가 불가능하게 되어 leak발생.

익명 사용자의 이미지

궁금.. wrote..
> char* a = malloc(5);
> a = "12345";
> 하면..malloc이 메모리에서 5바이트짜리의 연속된...
> 저장공간을 보장(?)해준다고 생각했는데..
>=> 역시 님의 생각이 맞습니다.

^^ 위의 식은 잘못된 것입니다.

음.. 위의 식이 어떻게 잘못된건지 궁금합니다.
제생각에는 틀릴게 없어 보이거든요..

제목이 이상해 졌군요.

어쨌거나 위의 문장은 간단하면서도.. 문제없어보이면서도
많은 문제(???)가 있습니다.
우선...

char* a = malloc(5);
a = "12345";
위의 문장은 syntax에러는 없습니다.
맞는 문장이니깐요.
그러의 원래 의도했던 결과가 되는 것이 아닙니다.
위의 첫번째 문장으로 인해 a는 5바이트를 할당 받습니다.
그런데 두번째 문장으로 인해서 a는 12345의 문자열이 저장되어있는 주소
값을 가지게 됩니다.
그것은 미리 할당받은 메모리로 12345가 복사되는 것이 아니고 단순이 a
포인터 변수가 12345를 가리키게 되는 것입니다.
의도했던 것(???)과는 틀리게 동작하지요.
어쨌거나 겉으로 보이게는 잘 동작하는것처럼(?) 보입니다.

첫번째의 문제가 잘 이해가 안되시는 분들은...
아래의 내용을 코딩해서 실행시켜 보시면 알게될 것입니다.

main()
{
char *a = malloc(5);
printf("%X\n", a);
a = "12345";
printf("%X\n", a);
}

우선 그것이 문제이고 자잘한 것을 몇가지 더 찾아보면
일단 malloc 함수는 함수원형이 아래와 같습니다
void *malloc(size_t size);
고로 첫번째 문장은 char *a = (char *)malloc(5);
가 좀더 정확한(?) 문장이겠지요.

그리고 두번째 문장에서
a = "12345"
라고 하였는데
만약 a 라는 변수에 메모리를 할당받고 그곳에 12345를 복사해 넣을 의도
였다면 정상적인 코딩이라면 아래와 같겠지요
char *a = (char *)malloc(5);
strcpy(a, "12345");
그런데 문제는 이곳에서 발생합니다.
12345는 문자열은 5자 이지만 실제로는 \0 을 맨뒤에 붙여서 저장소를 6
을 사용합니다. 고로 첫번째 문장은
char *a = (char *)malloc(6); 이 되어야겠죵
원래 뜻한바의 정확한 코딩은

char *a = (char *)malloc(6);
strcpy(a, "12345");

요런식이 되어야겠죵 ^^

그럼.

익명 사용자의 이미지

공혁준 wrote..
<snip>
> 따옴표로 문자열을 싸면...그안의 내용으로 메모리에
> 하나 만들어다가 그 시작주소를 리턴한다고 생각을했었는데..
> 아무래도 잘못된 생각같군요..
>=> ㅡㅡ;; 잘못된 생각 맞습니다.

님께서 잘못알고 계십니다.
char *a;
a = "aaaa"

"aaaa"는 문자열의 첫번째 주소번지를 가리키는 주소값으로 취급되어 할당
됩니다.
즉, 따옴표로 싸여진 문자열은 할당식에 사용될 경우 문자열의 첫번째 주
소번지로 취급되어 집니다.

켘 ㅡ,.ㅡ;; 아니요.. 제가 잘못 알고 있는게 아닌데요..ㅡㅡ;;
당연히 첫번째 주소 값이 넘어 가겠죠.. 그게 잘못된것이 아니고요..
질문자는 메모리할당.. 즉, 변수가 잡히냐는 질문이군요.. 제말은 메모리 할당이 이루어
지지 않는다는 뜻이죠..


> char* a = malloc(5);
> a = "12345";
> 하면..malloc이 메모리에서 5바이트짜리의 연속된...
> 저장공간을 보장(?)해준다고 생각했는데..
>=> 역시 님의 생각이 맞습니다.

^^ 위의 식은 잘못된 것입니다.
위의식이 잘못된건 아니죠.. 컴파일해보세요.. 에러나나.. 다만 메모리할당했으나
사용하지 않았을뿐이죠.. ^^;;


> strcpy( a, "12345" );
> 도 아니구..
malloc으로 할당한 크기와 "12345"의 크기가 다르군요. ^^
> 단순히 a = "12345";
> 하면 아예 malloc로 할당한 주소가 바뀔거라 생각했거든요..
> => 이또한 님의 생각 맞습니다.

질문자 답변자 모두 틀립니다.
첫부분의 답변처럼,
따옴표에 싸여진 문자열은 문자열의 첫번째 주소번지의 값으로 취급되어집
니다.
하기에

char *a = malloc(6);
/*편의상 a에 주소번지 100부터 시작하여 105까지의 6byte가 할당된다고
가정합니다. */

a = "12345";
따옴표에 싸여진 문자열은 문자열의 첫번째 주소번지의 값으로 취급되어집
니다.
편의상 문자열의 첫번째 주소번지를 200이라 가정합니다 .
결국 char *타입의 a에 저장된 주소번지의 값이 100이었다가, 할당식에 의
해 200으로 변한 것에 불과합니다.

<snip>

이또한 제가 틀린게 아닌데요.. ㅡㅡ;;
첨에 질문자가
-------------------------
strcpy( a, "12345" );
도 아니구..
단순히 a = "12345";
하면 아예 malloc로 할당한 주소가 바뀔거라 생각했거든요..
------------------------
라고 했죠? 이게 틀렸나요??

strcpy 한게 아니고 단순 대입했기때문에.. 주소가 바뀔꺼라 생각했다고 하자나요..
당연히 바뀌죠 주소는..

현재 이사람이 느끼는것은 맞으나.. 아직 경험이 없어 헷깔리고 있을뿐입니다.

댓글 달기

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