메모리 할당 문제가 가장 먼저 보여서 ^^;
스트링을 할당하시려면 배열로 초기화해서 메모리를 정적으로 확보해 주시던가...
new, malloc 등의 메모리 확보 함수를 이용해 주셔야합니다.
실 예...
[배열로 초기화]
char name[] = "Nam";
printf( "%s", name );
[포인터 초기화]
char* name1 = (char*)malloc(4);
char* name2 = new char(4);
strcpy( name1, "Nam" );
strcpy( name2, "Nam" );
위처럼 실제적으로 메모리를 확보하신후에 해당 메모리로 스트링을 복사해야합니다.
여기서 분명 헷갈리실지도 모릅니다. 배열로 초기화하면 되는데... 왜 포인터는 따옴표로 묶어도 안되는지 등등
혼란이 오겠지만, 메모리 관련은 분명히 하셔야 합니다.
printf문으로 출력하는것을 기준으로 예를 들어보겠습니다.
printf( "%s", name );
이런게 name을 출력하려면 보통 char* name 혹은 char name[4] 이런식으로 메모리를 확보합니다.
포인터 변수는 말 그대로 포인터 변수입니다. 즉, 포인터를 데이타로 저장하는 변수입니다.
포인터 = 메모리주소 , 그러므로 포인터 변수는 주소를 데이타로 기억하는 변수입니다.
(편리하고자 *(아스테리스크)를 사용했지만 그것에 현혹되지 말고 포인터 변수도 하나의 새로운 타입이라는것을
이해하시는게 먼저입니다.)
즉 포인터 변수에 따옴표로 묶은 스트링을 대입하면 확보되지 않은 메모리 영역을 스트링 주소로 알려주게됩니다.
char* name;
name = "Nam";
이러면 name 포인터 변수에는 "Nam"이 들어있는 주소값이 들어갑니다. 아마 0xFFFAAFA.. 등의 주소가 들어갈
것입니다. 즉 포인터 변수는 그 주소를 데이타로 기억합니다. 하지만 프로그래머는 그 주소를 우리가 원하는 데이타
인 Nam에 접근하기위한 연결선일 뿐입니다.
문제는 여기서 일어납니다.
연결선을 따라 printf 함수는 해당 주소에서부터 출력하려하지만 정상적인 값이 출력되지 않습니다.
확보하지 않은 메모리 영역이기에 사용한 그 순간에는 제대로 기록되어 있지만 윈도우 시스템은 다른 메모리 요청이
있으면 우리가 원하는 "Nam"이 있는 메모리 영역을 사용해 버릴 수 있습니다.
혹은 쓰레기 값으로 오류날 수도 있습니다....
그래서 new를 사용하며 그렇게 확보된 곳에는 직접 하나하나 첨자접근을 하지 않는다면 strcpy, memset같은 함수를
이용하며 스트링을 복사해야합니다.
배열의 경우는 해당 첨자 크기만큼 메모리가 정적으로 확보되기 때문에 시스템이 마음데로 써버리는것에서 보호됩니다.
돗대리아 님이 쓰신 글 :
: 몇년동안 접다가 다시 시작할려고 또 시작해 봅니다.
:
: 예전에 짜봤던 프로그램을 다시 해보니 안되더군요.
:
: 컴파일은 분명히 에러없이 넘었갔는대요. 실행이 안됩니다.
:
: 도무지 뭐가 문제인지를 모르겠습니다.
:
: 도와주세요... ㅠ.ㅠ
:
: 씨 너무 어려워요......
:
: 제가짠 프로그램이 무엇이 문제인지 함 봐주세요.....
:
: 아님 윈도우에서 지원이 안되는건지......@,.@;
:
:
: #include <stdio.h>
: #include <conio.h>
: void main (void)
: {
: char *ch1,*ch2,*ch3,*ch4,*ch5,*ch6,*ch7,*chs,*che,chf;
: int end=1,barf=1,i;
: float value1=0,value2=0,total=0;
: clrscr ();
: ch1="First value input";
: ch2="Next value input";
: ch3-"Calculation function input";
: ch4="Not input calculation function";
: ch5="No error";
: ch6="Welcome";
: ch7="Bye bye";
:
: f_1:
: while(end!=0){
: if(barf==1){
: value1=value2=total=0;
: chs=ch6; /* status "welcome" */
: che=ch5; /* error "no error" */
: chf=' '; /* function */
: }
: if(barf==2){
: chs=ch1; /* status "first value input" */
: }
: if(barf==3){
: scanf("%f",&value1);
: chs=ch3; /* function "calculation function input" */
: }
: if(barf==4||barf==9){
: chf=getch();
: chs=ch2; /* status "next value input" */
: }
: }
:
:
: while(barf==5){
: scanf("%f",&value2);
: switch(chf){
: case'+':total=value1+value2;
: chs=ch3;
: barf=3;
: break;
: case'-':total=value1-value2;
: chs=ch3;
: barf=3;
: break;
: case'*':total=value1*value2;
: chs=ch3;
: barf=3;
: break;
: case'/':total=value1/value2;
: chs=ch3;
: barf=3;
: break;
: case'c':value1=value2=total=0;
: barf=1;
: break;
: case'e':end=0;
: chs=che=ch7;
: goto f_1;
: default:che=ch4; /* error "not input calculation function" */
: value2=0;
: barf=7;
: break;
: }
: }
:
:
:
: printf( "___________________________________________\n");
: printf("| This program is \CALCULATOR\". |\n");
: printf("| Program by (2002.12.18~2002.12.22) |\n");
: printf("|===========================================|\n");
: printf(" %f%c%f=%f \n,value1,chf,value2,total" );
: printf("|===========================================|\n");
: printf("| |\n");
: printf("| --- --- --- --- --- |\n");
: printf("| | 7 | | 8 | | 9 | | + | | - | |\n");
: printf("| --- --- --- --- --- |\n");
: printf("| --- --- --- --- --- |\n");
: printf("| | 4 | | 5 | | 6 | | * | | / | |\n");
: printf("| --- --- --- --- --- |\n");
: printf("| --- --- --- --- --- |\n");
: printf("| | 1 | | 2 | | 3 | |Ext| |Cle| |\n");
: printf("| --- --- --- --- --- |\n");
: printf("| --- --- --- --- --- |\n");
: printf("| |Mem| | 0 | |Lod| |Del| | ? | |\n");
: printf("| --- --- --- --- --- |\n");
: printf("| |\m");
: printf("|===========================================|\n");
: printf(" Status : %s \n",chs);
: printf("|===========================================|\n");
: printf(" Error : %s \n",che);
: printf("|===========================================|\n");
: printf("| Mem = data memory, Lod = memory load |\n");
: printf("| Cle = data clear, Del = memory data clear|\n");
: printf("| Ext = prigram exit, ? = 미정 |\n");
: printf("|___________________________________________|\n");
:
: barf++;
: if(barf==6){
: value1=total;
: barf=3;
: }
: if(barf==8){
: chs=ch3; /* function "calculation function input */
: barf=9;
: }
: if(barf>9){
: clrscr ();
: printf("Program Error\n\n\n\n");
: printf("Press\"R\"key to\"NEW START\"\n");
: printf("Press\"E\"key or any key to \"EXIT\n");
: if(getch()=='r')end=1;
: else end=0;
: barf=1;
: clrscr();
: goto f_1;
: }
: }
|