繁体   English   中英

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

[英]what happen when constant string assigned to constant character pointer?

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

const char* p="String";

编译器如何以及在何处使用此数组..堆内存? 和它有什么不同:

char* p="String";

谢谢。

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

const字符串本身什么也没有发生:指向它的指针分配给p ,仅此而已。

编译器如何以及在何处使用此数组..堆内存?

它不会带到任何地方。 String的数据保留在原来的位置,这是编译器特有的。

以及与它有什么不同: char* p="String";

编译器将拒绝将字面量分配给非const的程序,或者警告您不赞成使用的转换,具体取决于C ++版本和/或编译器设置。 如果尝试使用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. (如果字符串文字位于可写内存中)同一字符串文字的其他用法会被修改,因为允许编译器将它们全部指向相同的存储。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM