一个经典问题的理解

先看两段程序:

//程序1,编译通过,运行出错
#include <stdio.h> 
int main() 
{ 
char *p="abcdef";  //p分配的地址在栈上,字符串"abcde"在静态存储区
p[2]='W'; 
printf(p); 
getchar(); 
return 0; 
} 

//程序2,编译通过,运行正确
#include <stdio.h> 
int main() 
{ 
char p[]="abcdef";  //p分配的地址在栈上,字符串"abcde"在静态存储区
p[2]='W'; 
printf(p); 
getchar(); 
return 0; 
} 
我们要看为什么程序1运行会出错而程序2运行正常,首先要明白变量p和常量字符串所在的存储位置。显然,常量字符串是存储在“静态存储区”,该存储区的内容只允许读,不允许写,也就是无法更改。程序1为变量p开辟了内存空间,且指向字符串“abcde”的首地址,由于指针p指向的是常量区,为p[2]赋值则表示更改常量区中字符串第二个字符的值,这是不允许的,因为常量区不允许写操作。而程序2中,虽然字符串“abcde”也是在常量区,也不允许写操作,但是在声明数组p时,已经分配内存空间,并且将常量区字符串的值拷贝到数组所在的栈空间内了,此时为p[2]赋值,并不是更改常量区的值,而是更改栈上的内容,栈的内容是允许写的,因此上面的问题就不难理解了...


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值