0

文字列リテラルのみか、char *ptr = "Hello World"それとも両方が"Hello World"文字列リテラルか?

#include <stdio.h>
#include <stdlib.h>

int main(void) {

    char array[] = { "Hello World" };
    char *ptr = "Hello World";

    printf( "%s\n", array );
    printf( "%s\n", ptr );

    printf( "%c\n", *array );
    printf( "%c\n", *ptr );

    printf( "%c\n", array[1] );
    printf( "%c\n", ptr[1] );

    return EXIT_SUCCESS;
}

# Hello World
# Hello World
# H
# H
# e
# e
4

7 に答える 7

5

"Hello World"は文字列リテラルです - に割り当てるchar *かコピーするかは関係ありませんchar []

char * ptr = "Hello World";本当にあるべきですconst char * ptr = "Hello World";-文字列リテラルは(読み取り専用メモリでは)変更できない場合があり、 a を使用するconst char *と、変更に対する追加の保護になります。

char array[] = { "Hello World" };安全です - これは潜在的な読み取り専用メモリからローカル変数に文字列リテラルをコピーします。

于 2011-03-22T15:45:45.840 に答える
3

"Hello world"何をするにしても、常に文字列リテラルです。

char *ptr = "Hello World";多くの場合変更できないスペースを指すポインターを定義します(したがって、 のように処理する必要がconst char *あり、そうしないとコンパイラーが実際に文句を言う可能性があります)。

char array[] = { "Hello World" };スタック上に配列を作成して、変更可能でほぼ等しいchar array[sizeof("Hello World")]; strcpy(array, "Hello World");

于 2011-03-22T15:45:50.763 に答える
2

"Hello World"文字列リテラルです。

char *ptr = "Hello World"; ptrが指している場合は"Hello World"、読み取り専用の場所に存在します。it via を変更しようとすると、ptr未定義の動作が発生します。

一方char array[] = { "Hello World" };、文字列リテラルの内容はスタックにコピーされます。これらのコンテンツは、UB を呼び出さずに変更できます。

ところで ISO C99 (セクション 6.4.5/6) は言う

それらの要素が適切な値を持っている場合、これらの配列が異なるかどうかは指定されていません。

つまり、コンパイラが 2 つ (またはそれ以上) の重複を処理するかどうかは指定されていません"Hello World"

于 2011-03-22T15:46:56.097 に答える
1

それ自体だけ"Hello World"が文字列リテラルです。

ptrchar文字列リテラルの最初の要素のアドレスで初期化されるポインタです。

arrayリテラルではなく配列です。

于 2011-03-22T15:48:15.723 に答える
0

"Hello World"コード内のどこにあるかに関係なく、文字列リテラルです。文字列リテラルptrでもありません。array

于 2011-03-22T15:45:26.957 に答える
0

これは、読み取り専用セクションで文字列リテラルにコンパイルされます。

        .section        .rodata
.LC0:
        .string "Hello World"

両方の出現は1つの配列に結合されます...少なくとも私のマシンではgccです。

于 2011-03-22T15:48:39.480 に答える
0

char array[] を宣言すると、char の配列 (読み取りと書き込みの両方でアクセス可能) を宣言し、この配列は何らかの文字シーケンスに初期化されます。

char * ptr を宣言すると、定数リテラル (コピーではない) を直接指すポインターが宣言され、それを読み取ることができます。

于 2011-03-22T15:52:41.137 に答える