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"是一个字符串文字 - 无论您是将其分配给 achar *还是将其复制到 achar []

char * ptr = "Hello World";真的应该const char * ptr = "Hello World";- 字符串文字可能是不可修改的(在只读内存中),并且使用 aconst 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"只读位置中的哪个。任何修改它的尝试ptr都会调用未定义的行为。

char array[] = { "Hello World" };字符串文字的内容被复制到堆栈中。您可以在不调用 UB 的情况下修改这些内容。

BTW ISO C99(第 6.4.5/6 节)说

如果它们的元素具有适当的值,则未指定这些数组是否不同。

这意味着编译器是否处理两个(或多个)不同的出现是未指定的"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"

这两种情况都组合成一个数组......至少在我的机器上使用 gcc。

于 2011-03-22T15:48:39.480 回答
0

当您声明 char array[] 时,您正在声明一个字符数组(可以读取和写入),并且该数组被初始化为一些字符序列

如果您声明 char * ptr,则您声明的是一个直接指向某个常量文字(而不是副本)的指针,您可以阅读它

于 2011-03-22T15:52:41.137 回答