当常量字符串分配给常量字符指针时会发生什么?

时间:2015-08-06 15:29:37

标签: c++ pointers

当常量字符串分配给常量字符指针(或字符指针)时会发生什么?例如:

const char* p="String";

编译器如何以及在哪里采用这个数组..堆内存? 与它有什么不同和:

char* p="String";

感谢。

2 个答案:

答案 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"的指针指向字符串文字。如果您随后尝试通过此指针进行编写,则不会出现编译器错误,而是您可能会看到运行时出现两个问题之一:

  1. (如果编译器/链接器已将字符串文字放入只读内存中),则会引发一个信号,指示内存访问冲突(类Unix系统上的char)。
  2. (如果字符串文字在可写内存中),则修改相同字符串文字的其他用法,因为允许编译器将它们全部指向同一存储。