이해가 안되는 부분이 있습니다.

assa의 이미지

문자열에 대해서 궁금한 점이 워낙 많아서 ^^;;

포인터에 대한 감이 올듯 말듯합니다..

다름이 아니라..

예로 ..

char *a= new char[30];

a= NULL;

a[0]= 'a';

하면 segmentation 오류가 납니다.(리눅스에서..)

그런데..

// a= NULL 하면 오류가 나지 않습니다.(주석처리하면..)

다른 예로

char *a= new char[30];

strcpy(a, "aaa");

a[0]= 'c';

하면 오류가 나지 않습니다.

참고로 strcpy(a, NULL); 하면 오류납니다...

문제는 NULL에 있는거 같은데....

명쾌한 답변을 부탁드립니다.

(리눅스 환경에서 해봤기 때문에 윈도우상에서는 어떤지 잘 모르겠네요.)

dgkim의 이미지

a=NULL; 하시면

a 포인터가 가리키는 주소가 사라져 버리는데..(?)

그 사라진 주소의 첫번째(a[0])에 값을 할당하니..

오류가 발생하죠..

그리고 strcpy(a, NULL);은 NULL이란 것은 당연히 a에 할당할 수 없는 것 아닌가요?

이렇듯 아주 정상적인 것 같은데.. 어떤 부분이 이해 안 되시나요?

assa의 이미지

저의 짧은 지식으로는 NULL 포인터가 있는 걸로 아는데요..

포인터가 사라져 버린다면..

a= NULL;

strcpy(a, "aaa"); 

해도 오류가 나야하지 않나요?

더더욱 해깔립니다...

dgkim의 이미지

assa wrote:
저의 짧은 지식으로는 NULL 포인터가 있는 걸로 아는데요..

포인터가 사라져 버린다면..

a= NULL;

strcpy(a, "aaa"); 

해도 오류가 나야하지 않나요?

더더욱 해깔립니다...

그건 에러가 안 나나요?

(역시 전 프로그래밍을 하지 않는 사람이라 무식합니다.)

progcom의 이미지

assa wrote:
저의 짧은 지식으로는 NULL 포인터가 있는 걸로 아는데요..

포인터가 사라져 버린다면..

a= NULL;

strcpy(a, "aaa"); 

해도 오류가 나야하지 않나요?

더더욱 해깔립니다...

오류납니다.

포인터는 단순히 메모리 공간을 가르키고 있는 것입니다.
a = NULL 이라면 아무것도 가르키고 있지 않으니, 아무것도 쓸 수 없는게 당연한것이지요. NULL 포인터는 가르키는 메모리 공간이 존재하지 않는 걸 지시하고 있을 뿐입니다.

assa의 이미지

제가 이해한게 맞는지 함 봐주세요

char *a= new char[5];

a= NULL;

a= "aaa"; 

이면 오류가 안나는데, "aaa" 에 대한 주소가 a에 저장되어(포인터) 오류가 안나는 반면

a가 동적할당되면 delete a시에 오류가 난다....

a= NULL;
strcpy(a, "aaa"); 

하면 "aaa"의 주소값이 a에 저장되는 것이 아니라, 바로 "aaa"가 배열처럼 저장
되어 오류난다...

그리고 a= NULL 이면 NULL 이라는 주소값이 a에 저장되고, NULL은 공백을 가리키므로 a에는 메모리 주소값은 넣을 수 있지만 직접 "aaa"같은 값을 넣을 수 없다..NULL 이 공백이므로...

이렇게 이해하면 되는건가요?

dgkim의 이미지

a= "aaa";는 a포인터가 "aaa"가 저장된 메모리의 주소를 가지게 됩니다.

그러나 strcpy를 하면 "aaa"내용을 a포인터가 가리키는 메모리 주소에 복사합니다.

and..

다음 코드는 동작할 가능성이 있습니다.(해보진 않았고)

char *a;
a="aaa";

하지만 다음 코드는 동작하지 않을 것입니다.(역시 해보진 않았고)
char *a;
strcpy(a, "aaa");
익명 사용자의 이미지

NULL은 포인터가 아무것도 가리키고 있지 않음을 나타내기 위한 특정 상태값이라 할 수 있습니다.

a = NULL;

여기서 a는 아무것도 가리키지 않게 됩니다.

a[0]= 'a';

a가 아무것도 가리키지 않는데 'a가 가리키는 공간의 첫번째 요소에 a를 대입하라'라는 명령을 내리니 당연히 문제가 생기지요.

a= NULL;
strcpy(a, "aaa");

위의 코드 또한 당연히 잘못된 코드입니다. 다만, C에서는 문제가 있다고 해서 '항상' 문제가 발생하지는 않습니다.

포인터 변수를 쓸때는 다음과 같은 사항을 항상 염두에 두어야 합니다.

1. 이 포인터 변수는 무엇을 가리키는가(즉, 가리키는 객체의 데이터형이 무엇인가)
2. 이 포인터 변수는 어디를 가리키는가(NULL인가 객체인가, 혹은 현재 존재하는 변수인가 아니면 이미 사라졌거나 또는 아직 만들어지지 않은 객체인가)

assa의 이미지

한발짝 한발짝씩 나아가는거 같아요..^^;;

고맙고 감사합니다..

즐거운 토요일 행복한 하루 되세요...^^

서지훈의 이미지

앞에 분들이 설명을 잘 해주셨는데...
저도 한 번 거덜어 드리면...
일단 pointer라는는 어디든지 가리킬 수가 있습니다.
그러나 배열은 ...
char *a= new char[30]; ===> char a[30];
은 pointer를 바꿀 수가 없습니다.
여기에서 하는 말에서도 전혀 틀리듯이...
배열과 pointer은 역활이 틀립니다.
그런데, 배열에다가 pointer를 지정할려고 하니 오류가 날 수밖에 없군요.
배열의 주소 변경이 불가능한 고정 pointer라고 보시면 되고, 안의 내용만 변경이 가능합니다.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

doldori의 이미지

서지훈 wrote:
일단 pointer라는는 어디든지 가리킬 수가 있습니다.
그러나 배열은 ...
char *a= new char[30]; ===> char a[30];
은 pointer를 바꿀 수가 없습니다.
여기에서 하는 말에서도 전혀 틀리듯이...
배열과 pointer은 역활이 틀립니다.
그런데, 배열에다가 pointer를 지정할려고 하니 오류가 날 수밖에 없군요.

지금까지 배열 얘기는 없었는데 이 말씀은 무슨 뜻인지요?
혹시 new를 하면 a가 char*에서 배열로 바뀐다는 뜻인가요?
서지훈의 이미지

C++은 자세히는 모르지만 new로 메모리 잡는게 배열에서 메모리를 잡는거와 같은 원리 아닌가요?
C에서는 new가 없어서 잘 모르겠지만.
아마도 C++에서는 new를 사용하는게 배열의 선언 하는거랑 같은 걸로 이해를 하고 있는데 ㅡㅡㅋ
제가 뭔가 착각 한거라도 있는지요?

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

doldori의 이미지

서지훈 wrote:
C++은 자세히는 모르지만 new로 메모리 잡는게 배열에서 메모리를 잡는거와 같은 원리 아닌가요?
C에서는 new가 없어서 잘 모르겠지만.
아마도 C++에서는 new를 사용하는게 배열의 선언 하는거랑 같은 걸로 이해를 하고 있는데 ㅡㅡㅋ

new로 할당한 메모리는 배열처럼 연속된 것이긴 하지요. 그렇지만 char* a로 선언했으니
a는 그 메모리를 가리키는 포인터일 뿐 a 자체가 배열이 되는 것은 아닙니다. 따라서
a = NULL 도 적법한 것입니다. (메모리 릭이나 널 포인터의 역참조 등은 별개의 문제이고요.)
char* a = malloc(30);
과 같은 관계라고 보면 됩니다.
서지훈의 이미지

제가 원문을 잘 못 이해한것 같네요 ...ㅡㅡㅋ
컴파일 에러가 아니라 run-time error인것을...
뭔가 조금 찝찝한것 같기도 했는데...
지적 감사합니다...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

댓글 달기

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