2011-09-14 6 views
0

다음 코드는 왜 다음과 같은 결과를 생성합니까?현재 디렉토리를 가져올 때 함수 결과가 "가비지"입니까?

내 코드 업데이트 : 나는 기본적으로 똑같습니다.

#ifdef _WIN32 
    #include <windows.h> 
    #include <direct.h> 
    #define GetCurrentDir _getcwd 
#else 
    #include <unistd.h> 
    #define GetCurrentDir getcwd 
#endif 

//==============================MAIN======================================= 
#ifdef _WIN32 
    int main(int argc, char **argv) 
    { 
     char *path = (char*)malloc(sizeof(char)*FILENAME_MAX); 
     GetCurrentDir(path, sizeof(path)); 
     printf("path: %s\n", path); 
     //other stuff 
    } 

//==============================END======================================== 

OUTPUT 경로 : -

+0

** 실제 ** 코드를 게시하지 않았기 때문에 말하기가 어렵습니다. 디버거에서 단계별 실행을 시도 했습니까? –

+0

이것은 내 프로그램에서 직접 붙여 넣은 사본입니다. – Newbie

+0

이제'printf' 문을 추가 한 것을 볼 수 있습니다 ... –

답변

2

get_current_path에 선언 된 로컬 변수에 대한 포인터를 반환합니다. 즉, 함수가 반환되면 정리 될 가능성이있는 변수입니다.

sizeof(path)

int main(int argc, char **argv) 
{ 
    char *path = (char*)malloc(sizeof(char)*FILENAME_MAX); 
    GetCurrentDir(path, sizeof(path)); 
    printf("path: %s\n", path); 
    //other stuff 
} 
4 또는 8 (32 비트 또는 64가 될 것입니다 : 당신은 당신의 수정 PER

void char* get_current_path(char* outDir) 

, 즉, 인수로 버퍼를 적용하고 호출자를 작성해야 비트) 이제는 포인터가 아니기 때문에 배열이 아닙니다. 실제 크기 (예 : sizeof(char) * FILENAME_MAX)를 전달해야합니다.

int main(int argc, char **argv) 
{ 
    size_t bufSize = sizeof(char) * FILENAME_MAX; 
    char *path = (char*)malloc(bufSize); 
    GetCurrentDir(path, bufSize); 
    printf("path: %s\n", path); 
    //other stuff 
} 
6

current_dir 스택 변수이며, 반환에 사방지고 있습니다. 이를 static으로 선언하거나 char 버퍼를 매개 변수로 사용하십시오.

+0

+1, 너무 느 렸습니다. –

2

current_dir은 로컬에서 get_current_path()에 해당하므로 함수가 반환 될 때 스택에서 꺼내고 런타임에서 원하는 스택 위치를 자유롭게 지정할 수 있습니다. 그것이 printf이 횡설수설하는 이유입니다.

다음을 수행

  • 중 하나를 문제를 해결하려면 (나는 또한 그것을 static 배열 할 것) 범위를 제기 할 수 static
  • 이동 배열 선언과 배열을 선언하고 main()는 참조 할 수 있습니다 배열에 직접 포인터를 다시 전달할 필요가 없습니다.
  • malloc을 사용하면 get_current_path() 함수 내에 버퍼를 할당하고 할당 된 버퍼 포인터를 반환합니다. 이렇게하면 사용을 마친 후에 free 할당 된 메모리를 잊어 버리지 마십시오.
  • @ JonathanPatschke가 대답 한 바에 따르면 get_current_path()을 배열 포인터를 허용하도록 변경할 수 있다고 말하면 static을 만들 필요가 없습니다.
관련 문제