当常量字符串分配给常量字符指针(或字符指针)时会发生什么?例如:
const char* p="String";
编译器如何以及在哪里采用这个数组..堆内存? 与它有什么不同和:
char* p="String";
感谢。
答案 0 :(得分:0)
当常量字符串分配给常量字符指针(或字符指针)时会发生什么?
const字符串本身没有任何变化:指向它的指针被分配给p
,这就是全部。
编译器如何以及在何处使用此数组..堆内存?
它不会把它带到任何地方。 String的数据保持原样,这是一个特定于编译器的东西。
与它有什么不同,并且:
char* p="String";
编译器将拒绝将文字分配给非const的程序,或者警告您不推荐使用的转换,具体取决于C ++版本和/或编译器设置。
如果您尝试使用p[...]
声明修改const
的内容,编译器将阻止您。如果您尝试在没有const
的情况下执行相同的操作,程序可能会编译,它会在运行时导致未定义的行为。
答案 1 :(得分:0)
字符串文字===
是程序中某处的"String"
的静态数组,当您的操作系统设置了可执行文件时,它可能被放入地址空间的只读部分。
当您指定const char
时,const char *p = "String"
会使用指向该p
数组的指针进行初始化。因此const char
为*p
而'S'
为p[1]
等。
当您指定't'
时,您的编译器应该拒绝(可能您没有设置足够的诊断级别?)。如果你告诉编译器无论如何都接受它,那么你有一个指向(可修改的)char *p = "String"
的指针指向字符串文字。如果您随后尝试通过此指针进行编写,则不会出现编译器错误,而是您可能会看到运行时出现两个问题之一:
char
)。