指针常量与字符串常量的冲突

看程序员面试笔记看到一段代码,记录一下:

int main(){
	char* const str="apple";
	*str="orange";
	cout<<str<<endl;
	getchar();
}

这段代码有两个问题:
1.str是char* 类型,要给str赋值要写str=“orange”;
2.如果只把str前的*号去掉,程序还是不对的。str是常量指针 指针常量,开始指向apple串,这个串是在内存的常量区的,那么str="orange"后str就指向了常量区另一块内存,这是不允许的。
要改成正常的char指针才可以正常改动其存储的数据。

char* str="apple";
str="orange";

我又写了个代码:

int main(){
	char* str="apple";
	*str='x';
	cout<<str<<endl;
	getchar();
}

运行错误。在这里插入图片描述
再写一个:
在这里插入图片描述
证实了我的想法:char[]数组开的空间是在栈的,apple字符串直接放到数组空间里去,所以第二个图是可以的。

char*的这个指针开的空间也在栈,但char * str=“apple”;其中的执行顺序应当是先将apple加入到内存的常量区,然后把这个常量区里的apple串的地址赋给了str。所以当我们改str处的字符,就相当于直接改动内存常量区,这显然不允许。
贴一个相关的回答:

//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b;char s[] = "abc";char *p2;char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得1020字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"
优化成一个地方。
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值