이해가 안되는 부분이 있습니다.
글쓴이: assa / 작성시간: 토, 2005/04/02 - 12:17오후
문자열에 대해서 궁금한 점이 워낙 많아서 ^^;;
포인터에 대한 감이 올듯 말듯합니다..
다름이 아니라..
예로 ..
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에 있는거 같은데....
명쾌한 답변을 부탁드립니다.
(리눅스 환경에서 해봤기 때문에 윈도우상에서는 어떤지 잘 모르겠네요.)
Forums:
프로그래밍에 대해 무식한 사람의 답변
a=NULL; 하시면
a 포인터가 가리키는 주소가 사라져 버리는데..(?)
그 사라진 주소의 첫번째(a[0])에 값을 할당하니..
오류가 발생하죠..
그리고 strcpy(a, NULL);은 NULL이란 것은 당연히 a에 할당할 수 없는 것 아닌가요?
이렇듯 아주 정상적인 것 같은데.. 어떤 부분이 이해 안 되시나요?
저의 짧은 지식으로는 NULL 포인터가 있는 걸로 아는데요..포인
저의 짧은 지식으로는 NULL 포인터가 있는 걸로 아는데요..
포인터가 사라져 버린다면..
해도 오류가 나야하지 않나요?
더더욱 해깔립니다...
[quote="assa"]저의 짧은 지식으로는 NULL 포인터가 있는 걸
그건 에러가 안 나나요?
(역시 전 프로그래밍을 하지 않는 사람이라 무식합니다.)
[quote="assa"]저의 짧은 지식으로는 NULL 포인터가 있는 걸
오류납니다.
포인터는 단순히 메모리 공간을 가르키고 있는 것입니다.
a = NULL 이라면 아무것도 가르키고 있지 않으니, 아무것도 쓸 수 없는게 당연한것이지요. NULL 포인터는 가르키는 메모리 공간이 존재하지 않는 걸 지시하고 있을 뿐입니다.
제가 이해한게 맞는지 함 봐주세요[code:1]char *a= n
제가 이해한게 맞는지 함 봐주세요
이면 오류가 안나는데, "aaa" 에 대한 주소가 a에 저장되어(포인터) 오류가 안나는 반면
a가 동적할당되면 delete a시에 오류가 난다....
하면 "aaa"의 주소값이 a에 저장되는 것이 아니라, 바로 "aaa"가 배열처럼 저장
되어 오류난다...
그리고 a= NULL 이면 NULL 이라는 주소값이 a에 저장되고, NULL은 공백을 가리키므로 a에는 메모리 주소값은 넣을 수 있지만 직접 "aaa"같은 값을 넣을 수 없다..NULL 이 공백이므로...
이렇게 이해하면 되는건가요?
거의 맞습니다.
a= "aaa";는 a포인터가 "aaa"가 저장된 메모리의 주소를 가지게 됩니다.
그러나 strcpy를 하면 "aaa"내용을 a포인터가 가리키는 메모리 주소에 복사합니다.
and..
다음 코드는 동작할 가능성이 있습니다.(해보진 않았고)
하지만 다음 코드는 동작하지 않을 것입니다.(역시 해보진 않았고)
NULL은 포인터가 아무것도 가리키고 있지 않음을 나타내기 위한 특정 상
NULL은 포인터가 아무것도 가리키고 있지 않음을 나타내기 위한 특정 상태값이라 할 수 있습니다.
a = NULL;
여기서 a는 아무것도 가리키지 않게 됩니다.
a[0]= 'a';
a가 아무것도 가리키지 않는데 'a가 가리키는 공간의 첫번째 요소에 a를 대입하라'라는 명령을 내리니 당연히 문제가 생기지요.
a= NULL;
strcpy(a, "aaa");
위의 코드 또한 당연히 잘못된 코드입니다. 다만, C에서는 문제가 있다고 해서 '항상' 문제가 발생하지는 않습니다.
포인터 변수를 쓸때는 다음과 같은 사항을 항상 염두에 두어야 합니다.
1. 이 포인터 변수는 무엇을 가리키는가(즉, 가리키는 객체의 데이터형이 무엇인가)
2. 이 포인터 변수는 어디를 가리키는가(NULL인가 객체인가, 혹은 현재 존재하는 변수인가 아니면 이미 사라졌거나 또는 아직 만들어지지 않은 객체인가)
고맙습니다.
한발짝 한발짝씩 나아가는거 같아요..^^;;
고맙고 감사합니다..
즐거운 토요일 행복한 하루 되세요...^^
앞에 분들이 설명을 잘 해주셨는데...저도 한 번 거덜어 드리면...
앞에 분들이 설명을 잘 해주셨는데...
저도 한 번 거덜어 드리면...
일단 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);
[quote="서지훈"]일단 pointer라는는 어디든지 가리킬 수가 있
지금까지 배열 얘기는 없었는데 이 말씀은 무슨 뜻인지요?
혹시 new를 하면 a가 char*에서 배열로 바뀐다는 뜻인가요?
C++은 자세히는 모르지만 new로 메모리 잡는게 배열에서 메모리를 잡는
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);
[quote="서지훈"]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);
댓글 달기