如果我将字符重新分配给 * p ,则会发生更改。
#include<stdio.h>
int main()
{
char* p="hello" ;
printf("%s",p);
*p='a' ;
printf("%s",p);
return 0;
}
* p =&#39; a&#39; 应该用&#39; a&#39替换&#39; h&#39; ; 在字符串中。
* p应该访问并指出由p指向的字符串的基本元素并替换它。
但打印语句打印&#34;你好&#34;两次
但它不能解释为什么不?
答案 0 :(得分:3)
此:
*p='a' ;
是非法的,因为p
指向文字字符串。不幸的是,由于历史原因,C允许您将文字字符串的地址存储在非const指针中,而不进行任何强制转换或警告。但实际上,你应该这样做:
const char* p="hello" ;
然后您的编译器将拒绝此程序,因为它无法修改文字字符串。
答案 1 :(得分:0)
char* p="hello" ;
会将hello
放在内存的只读部分,并使p
指向该内存,使得对此内存的任何写入操作都是非法的。
它没有名称,并且具有静态存储持续时间(意味着它在程序的整个生命周期中存在);和一个名为p
的指向char的类型的变量,它使用该未命名的只读数组中第一个字符的位置进行初始化。
所以
*p='a' ;
会导致内存访问冲突。