4

この質問は、このSO回答の拡張だと思います。次のコードがあるとします。

#include <stdio.h>
#include <string.h>

void func(char *str)
{
    strcpy(str, "Test");
}

int main()
{
    char testStr[20] = "Original";
    func(testStr);
    printf("%s\n", testStr);  /* Prints "Test" followed by a new-line */
    return 0;
}

私の理解では、引数として読み取り専用リテラルfuncへのポインタを期待するべきではありませんか?一方、渡されるのは、読み取り専用リテラルのスタック上のコピーです。

これで正しい結果が得られますが、これは100%正しいですか?代わりにfunc()受け入れられた場合、コードの可読性が向上しますか?char []char *

4

2 に答える 2

8

Your understanding is correct. The code is fine.

The following, on the other hand, isn't:

void func(char *str)
{
    strcpy(str, "Test");
}

int main()
{
    char* testStr = "Original";
    func(testStr);
}

This attempts to modify a string literal, resulting in undefined behaviour.

As to the question of readability, that's subjective.

于 2013-03-21T08:38:32.080 に答える
0

すべての文字列は の配列へのポインタでcharあるため、違いはありません。関数のスタックに割り当てられた文字列のコピーはなく、渡されたものと同じであり、パラメーターを配列として宣言しても、関数内の文字列にストレージは割り当てられません。これは、同じことを記述する別の方法です。 .

ただし、配列を文字列リテラルで初期化すると、リテラルのコピーが配列に作成されます。文字列がリテラルから派生したものかどうかは、まったく別のものであるため、問題ではありません。

リテラルを期待している場合は、const必要に応じて関数パラメーターを宣言できますが、必須ではありません。C の文字列リテラルは読み取り専用ではありませんが、未定義の動作によってそれらが変更されます。

于 2013-03-21T08:47:48.863 に答える