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

what happen when constant string assigned to constant character pointer?

本文关键字:常量 什么 指针 字符串 赋值 字符      更新时间:2023-10-16

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

const char* p="String";

编译器如何以及在哪里获取这个数组。堆内存?和

有什么不同?
char* p="String";

谢谢。

当常量字符串赋值给常量字符指针(或字符指针)时会发生什么?

const string本身没有任何变化:指向它的指针被赋值给p,仅此而已。

编译器如何以及在哪里获取这个数组。堆内存吗?

它不带它去任何地方。String的数据保持在原来的位置,这是特定于编译器的事情。

和:char* p="String";

有什么不同?

根据c++版本和/或编译器设置,编译器将拒绝将文字赋值给非const的程序,或者警告您不赞成的转换。如果您试图使用const声明修改p[...]的内容,编译器将阻止您。如果您尝试在没有const的情况下做同样的事情,程序可能会编译,但它会在运行时导致未定义的行为。

字符串字面量"String"const char的静态数组,在你的程序中的某个地方,当你的操作系统设置可执行文件时,可能被放置在地址空间的只读部分。

当你赋值const char *p = "String"时,p被初始化为指向const char数组的指针。所以*p就是'S', p[1]就是't',等等。

当您分配char *p = "String"时,那么您的编译器应该拒绝它(也许您没有足够的诊断级别集?)如果你告诉编译器不管怎样都接受它,那么你就有一个指向(可修改的)char的指针指向字符串字面值。如果您随后尝试通过该指针进行写操作,则不会得到编译器错误,相反,您可能会在运行时看到以下两个问题之一:

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