|
만두박사 님이 쓰신 글 :
: AnsiString이 꼬여서 원하는 문자가 제대로 입력되지 않고 있습니다.
:
: else if(pop_num < 100)
: temp_foldername_2 = "experiment_0" + IntToStr(pop_num);
:
: 줄을 지나면 temp_foldername_2 가 "experiment_011"이 되어야 하는데,
: 자꾸 "istory matching" 이런 식으로 이상한 문자들이 들어가게 되네요.
:
: 무엇이 문제인지 알고 싶습니다.
:
:
:
: int CreateFiles(char *foldername)
: {
: int i;
:
: int popsize;
: popsize = 12;
: int pop_num;
: pop_num = 11;
:
: char *newpath;
: char *newfile;
:
: char *newpath2;
: char *foldername_2;
:
: newpath = "";
: strcat(newpath, foldername);
:
: // 새폴더 생성
: mkdir(newpath);
:
: for(i=0;i<popsize;i++)
: {
: // 새하위폴더명 생성
: if(pop_num < 10)
: temp_foldername_2 = "experiment_00" + IntToStr(pop_num);
: else if(pop_num < 100)
: temp_foldername_2 = "experiment_0" + IntToStr(pop_num);
: else if(pop_num < 1000)
: temp_foldername_2 = "experiment_" + IntToStr(pop_num);
: else
: {
: // Error!!
: // ShowMessage "Too many population!"
: }
:
: foldername_2 = "";
: foldername_2 = temp_foldername_2.c_str();
:
: // 새하위폴더 생성
: newpath2 = "";
: strcpy(newpath2, newpath);
: strcat(newpath2, "\\");
: strcat(newpath2, foldername_2);
: mkdir(newpath2);
:
: // 새파일명 생성
: newfile = "DATAFILE";
: strcat(newpath2, newfile);
:
: // 새파일 생성
: ofstream outfile1;
: outfile1.open(newfile);
: outfile1<<"MBH"<<" "<<"!!"<<endl;
: outfile1.close();
: }
: return 0;
: }
모든 변수는 자신만의 메모리를 갖습니다.
따라서, 포인터 변수 또한 자신만의 메모리를 갖습니다.
포인터 변수가 차지하는 메모리에 저장된 값은 메모리 상의 번지로 취급됩니다.
그런데, 현재 이상하게 되어있지요.
명시적으로 할당한 메모리의 번지 또는 각종 변수 선언/정의에 따라 자동으로 할당된 메모리의 번지를 포인터 변수에 저장한 적이 없지요.
현재 소스에는 포인터 변수에 정적 문자열의 번지를 대입하고 있습니다.
컴파일/링크 시 정적문자열들은 한 쪽에 모아둡니다.
그 곳에 쓰기 작업을 하면 문제가 발생할 수 있습니다.
특히 newpath = ""; 처럼 빈 문자열의 번지를 포인터 변수에 저장해두고 strcat(newpath, foldername);처럼 무언가 그 메모리(포인터 변수에 저장된 값 즉 번지에 해당하는 메모리)에 쓰기 작업을 하면 거의 무조건적인 오버플로우로 더욱 더 문제가 되겠지요. 빈 문자열이 저장된 곳이 아니더라도 얼마든지 오버플로우는 발생할 수 있습니다. 그 곳에 쓰기작업을 하면 오버플로우 문제뿐만이 아니라 기존에 저장된 정적문자열이 사라지게 되는 문제도 있습니다.
포인터 변수의 메모리나 그 값이 가리키는 메모리에 무엇을 저장하든 프로그래머 마음입니다만, 어디까지나 의도된 것이어야 하고 안전해야 하며 효율적이어야 합니다.
그런데, 현재 소스에서는 전혀 의도된 것이 아니며 안전하지도 않습니다.
|