C:string-literal - 问题

时间:2011-03-22 15:42:12

标签: c string-literals

仅在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

7 个答案:

答案 0 :(得分:5)

"Hello World"是一个字符串文字 - 无论您是将其分配给char *还是将其复制到char []

char * ptr = "Hello World";应该是const char * ptr = "Hello World"; - 字符串文字可能是不可修改的(在只读内存中),使用const char *是防止修改的额外保护。

char array[] = { "Hello World" };是安全的 - 这将字符串文字从潜在的只读内存复制到局部变量中。

答案 1 :(得分:3)

"Hello world"始终是一个字符串文字,无论你用它做什么。

char *ptr = "Hello World";定义了一个指向空间的指针,该指针通常不可修改(所以你应该像const char *一样处理它,如果你不这样做,你的编译器可能会抱怨。)

char array[] = { "Hello World" };在堆栈上创建数组,因此它可以修改并大致等于char array[sizeof("Hello World")]; strcpy(array, "Hello World");

答案 2 :(得分: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"个不同的出现。

答案 3 :(得分:1)

只有"Hello World"本身才是字符串文字。

ptr是使用字符串文字的第一个元素的地址初始化的char的指针。

array是一个数组而不是文字。

答案 4 :(得分:0)

"Hello World"是一个字符串文字,无论它出现在代码中的哪个位置。 <{1}}和ptr都不是字符串文字。

答案 5 :(得分:0)

在只读部分编译为字符串文字。

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

两次出现都合并为一个阵列......至少在我的机器上使用gcc。

答案 6 :(得分:0)

当你声明char array []时,你声明了一个chars数组(可以读取和写入),并且这个数组被初始化为某个字符序列

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