2017-09-06 6 views
0

関数で作業中にエラーが発生しました。 debbugerは_chdir(dirCorrente);行の "damied heap"と言っています。動的に割り当てられた変数と_chdirウィンドウを操作しているときにヒープが破損した場合は、

mainは以下のような関数を呼び出します。 - char * temp = getCartellaCorrente(); - これらの機能に関連していないいくつかの他のもの... - TEMP = setCartellaCorrente( "CDテスト")

は実行がsetCartellaCorrenteのdirCorrente値が停止する「"C:\ユーザーはルカ\デスクトップ\ \リモート - コントロールプロジェクト\ FirstService \ Debug \ test "'

私は動的に割り当てられた変数に何か間違っていると思います。

私は48時間以来この問題に取り組んでいます。私は割り当てられた変数や_chdir関数について何か重要なことは知らないと思います。

あなたが私が恋しいことを私に説明することができれば、本当に感謝しています。

char* getCartellaCorrente() { 
    char* temp; 
    size_t size; 
    LPWSTR dirCorrente = new TCHAR[DEFAULT_BUFLEN]; 
    GetCurrentDirectory(DEFAULT_BUFLEN, dirCorrente); 
    size = wcslen(dirCorrente); 
    temp = (char *)malloc(size); 
    wcstombs_s(NULL, temp, size+1, dirCorrente, size); 
    return temp; 
} 

char* setCartellaCorrente(char* relative) { 
    char *dirCorrente; 

    if (strlen(relative)>=5 && relative[4] == ':') { 
     dirCorrente = (char *)malloc(DEFAULT_BUFLEN); 
     strcpy_s(dirCorrente, DEFAULT_BUFLEN, &relative[3]); 
    } 
    else { 
     dirCorrente = getCartellaCorrente(); 
     relative[2] = '\\'; 
     strcat_s(dirCorrente, DEFAULT_BUFLEN, &relative[2]); 
     printf("goode %s \n", dirCorrente); 
    } 
    //fixPathSlash(dirCorrente); 
    printf("\n2: %s\n", dirCorrente); 
    int i = _chdir(dirCorrente); //HERE IT STOPS 
    printf("wtf: %d\n", i); 
    free(dirCorrente); 
    printf("boh\n"); 
    return getCartellaCorrente(); 
} 

これは私の最初の質問です。申し訳ありませんが、私はいくつかの重要な情報を逃した場合、私は速く編集します。

+1

'_chdir'はあなたのパスにダメージを与えません。どこかのバッファを上書きしています。また、あなたは、 'main'関数と* included *ヘッダを含む問題を再現する短い例である[mcve]を絶対に**提供しなければなりません。 –

+0

このコードは '/ fixPathSlash'のためコンパイルされません –

+0

あなたのコードは** C++ **で、Cではなく、a)あなたがC++コンパイラでコンパイルしているので、b)あなたは' new'を使用しています。 –

答えて

0

私は問題が割り当てだったので、私は問題を解決することができました。 私はこれを早急に解決する必要があるので、私は上記の方法を使いました。とにかく、割り当てられた変数を扱う方法を研究し、改善するために修正します。

void getCartellaCorrente(char* temp) { 
    size_t size; 
    LPWSTR dirCorrente = new TCHAR[DEFAULT_BUFLEN]; 
    GetCurrentDirectory(DEFAULT_BUFLEN, dirCorrente); 
    size = wcslen(dirCorrente); 
    wcstombs_s(NULL, temp, DEFAULT_BUFLEN, dirCorrente, size); 
} 

void setCartellaCorrente(char* relative, char* dirCorrente) { 

    if (strlen(relative)>=5 && relative[4] == ':') { 
     strcpy_s(dirCorrente, DEFAULT_BUFLEN, &relative[3]); 
    } 
    else { 
     getCartellaCorrente(dirCorrente); 
     relative[2] = '\\'; 
     strcat_s(dirCorrente, DEFAULT_BUFLEN, &relative[2]); 
    } 
    int i = _chdir(dirCorrente); 
    return getCartellaCorrente(dirCorrente); 
} 

パス変数は現在静的サイズで主に割り当てられ、機能ではなく、彼らはそれを直接変更し、正しい値を返しません。

+0

あなたはまだ間違っている。決して、決して*あなたがtempがDEFAULT_BUFLEN要素を持っていることを知らない。嘘は、破損したヒープを生成する。それを割り当てたくないなら(レイモンド氏の言ったように)、文字列を受け入れることができるので、少なくともバッファ長を引数として渡します。 –

+0

@ HansPassant私は実際には「char temp [DEFAULT_BUFLEN]」として初期化しています。実行時に正しく割り振る方法を学ぶまでは、ちょっとした修正が必要です。 –

関連する問題