仅在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
答案 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,则声明一个直接指向某个常量文字(不是副本)的指针,你可以只读它