|
jeroh 님이 쓰신 글 :
: malloc을 했는데도,memory가 할당되지 않아, 변수 값이 NULL로 나오는군요.
: mallo이 안되는 경우는 어떤 경우인가요?
:
:
: 그리고 또 다른 질문..
:
: char* test;
: test = (char*)malloc(sizeof(a));
: strcpy(test,"test");
: printf("%s",test);
: free(test);
: printf("%s",test);
:
: 아래의 code에서 test를 free해주고 난 다음에 printf를 하면 여전히 test의 값이 찍히는데,
: free를 하면 memory가 해제되니까 안찍혀야 되는 거 아닌가요?
:
: 또, free(test)와 test=NULL 의 code에는 어떤 차이가 있나요?
:
:
포인터와 메모리의 확보에 대해서 혼돈이 오고계신것같습니다.
생각보다 자질구레하면서 아리송할 수 있는 부분이죠. ^^;;
일단 아래를 보시죠.
char* test;
test = (char*)malloc(sizeof(5));
strcpy(test,"test");
printf("%s\n", test);
free(test);
// --- 요 아래 부분부터가 바로 문제의 부분이죠??
// 포인터는 아래와같이 스트링의 포인터를 바로 받아서 사용할 수 있지요.
// 물론 malloc의 경우는 메모리의 확보에 기준이 있는것입니다.
// 즉, 비록 위에서 malloc으로 잡은 부분을 free시켜 주었지만
// 아직 포인터 자체의 기능은 남아있는 것입니다.
// 결국 아래의 코드는 포인터 자체 기능으로 "tttt"의 메모리 포인터를
// 받아서 가지고 있게 되는 것이지요. 아마 test[6]번째 정도가면 쓰레기
// 값이 존재할 겁니다.
// *test의 역할은 "tttt"의 시작 포인터를 가지고 있는것입니다.
// 여기에 말록으로 할당 받은 메모리 영역에다가 strcpy를 사용하셨으니
// 메모리를 할 당받아서는 침범할 수 없는 구역이 되지요.
// 즉, 안전한 구역을 생성하는 것입니다.
// malloc의 역할은 메모리 확보에 있는것이지 그 메모리 내부의 값을 어떻게
// 하는것이 아니라는 것입니다. 물론 malloc이 해제된후에는 어쩔 수 없이
// malloc 위치에 있던 문자들은 다른 메모리 확보들로부터 안전할 수 없게
// 되는것입니다.
test = "tttt";
printf("%s\n",test);
printf("%c %c %c %c %c %c %c", test[0], test[1], test[2], test[3], test[4], test[5], test[6]);
아래를 보시고 다시한번 정리하시기 바랍니다.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
char* test;
test = (char*)malloc(sizeof(5));
strcpy(test,"test");
printf("%s\n", test);
printf("%c %c %c %c %c %c %c", test[0], test[1], test[2], test[3], test[4], test[5], test[6]);
free(test);
test = "tttt"; // 물론 tttt의 부분도 메모리 확보가 되는것입니다. 요렇게 "tttt\0"
printf("\n%d\n", sizeof("tttt")); // 분명 크기가 5로 나올것입니다.
printf("%s\n",test);
printf("%c %c %c %c %c %c %c %c", test[0], test[1], test[2], test[3], test[4], test[5], test[6], test[7]);
getch();
return 0;
}
그리고 메모리 확보는 특별한 경우가 아니면 malloc보다는 new를 사용하시는 것이 좋습니다.
보다더 안전하기 때문입니다. new는 함수가 아니라 클래스입니다.
하지만 malloc으로 메모리 관리를 해보시는것도 좋다고 봅니다. 메모리에서 어떤관리가 필요한지
느낄수 있기때문입니다.
그럼 즐거운 하루되세요~~
|