1

関数で free を正しい方法で使用しているかどうか教えてください。コードを valgrind でチェックしましたが、エラーは発生しませんでした。

void strconcat (char **str1, const char *str2) {
    unsigned long str1len = strlen(*str1);
    unsigned long str2len = strlen(str2);

    char *tempStr = malloc(sizeof(char) * (str1len + str2len + 1));
    memcpy(tempStr, *str1, str1len);
    memcpy(&(tempStr[str1len]), str2, (str2len + 1));

    free(*str1);
    *str1 = tempStr;
}

main-function では、次のように関数を呼び出しています。

int main() {

    char *str1 = malloc(25);
    str1 = strcpy(str1, "First part of the string");

    char *str2 = malloc(16);
    str2 = strcpy(str2, " - second part.");
    printf("%s\n", str2);

    strconcat(&str1, str2);

    printf("%s\n", str1);

    free(str1);
    free(str2);

    return EXIT_SUCCESS;
}

ご協力ありがとうございました!

4

2 に答える 2

0

関数で解放した後、 void strconcat()malloc'dtempStr変数を に割り当てているため*str1、valgrind でデバッグしてもエラーは発生しません。

関数から行を削除 *str1 = tempStrし、プログラムをコンパイルして実行すると、プログラムがクラッシュします。ダブルフリーだから。

編集:

malloc を使用して割り当てられたすべてのメモリを解放する必要があります。str1メモリリークを避けるために、他の変数に代入する前にメモリを解放する必要があります。

free(*str1) - free for memory allocated to str1 in main() function
free(str1) - free for memory allocated to tempStr in strconcat() function.
free(str2) - free for memory allocated to str2 in main function.
于 2013-09-02T18:10:02.010 に答える