5

次のコード例では、パラメーターを解放できませんconst char* expression

// removes whitespace from a characterarray
char* removewhitespace(const char* expression, int length)
{
    int i = 0, j = 0;
    char* filtered;
    filtered = (char*)malloc(sizeof(char) * length);
    while(*(expression + i) != '\0')
    {
        if(!(*(expression + i) == ' '))
        {
            *(filtered + j) = *(expression + i);
            j++;
        }
        i++;
    }
    filtered[j] = '\0';
    free(expression); //this doesn't seem to work
    return filtered;
}

この関数を返す前に、式パラメーターのデータを解放しようとしましたが、解放できないようです。
定数だからだと思いますが、Cの文字配列は常に定数でなければならないことを学びました。

私が受け取るエラーメッセージは次の行にfree(expression)あり、メッセージは次のとおりです。
expected void* but argument is of type const char * - compiler error

データに含まれるメモリを破棄するにはどうすればよいexpressionですか?

4

3 に答える 3

9

定数の場合は、割り当てられていないため、削除しないでください。呼び出し元はスタックベースの配列をメソッドに簡単に渡すことができ、解放するのは悪いことです

最も一般的な規則は、コードがデータを割り当てる場合は、データを解放する必要があるというものです。それが合法的なことでさえあるかどうかを知る方法がないので、その議論を解放することは実際にはあなたのルーチンの責任ではありません。

于 2012-06-15T19:54:47.503 に答える
1

本当にこのような関数(ヒープポインターを取得して解放し、別のヒープポインターを返すにもかかわらず)が必要な場合は、それを非常によく文書化する必要があります。

その上、あなたが見るように、それは一致しないのでexpression、あなたはを作るべきではありません。ただし、問題ないはずです。const char*char*

于 2012-06-15T20:08:07.503 に答える
1

質問を直接簡単に進めると free((void*)expression); 、コンパイルエラーを解決するのに十分なはずです。 しかし、すでに他の人が状態を持っているので、メモリを管理するために誰があなたの関数を呼び出しているかを許可する必要があります

于 2015-08-03T20:51:48.087 に答える