c语言关于字符串常量的问题

c语言关于字符串常量的问题。

我们先看一个例子:

char *ptr = "David";

ptr[4] = 'x';

printf("%s\n", ptr);

// 这里说一下,ptr是指针, 指向一个字符串 常量!!
// 所以说
// ptr[4] = 'x';
// 上面的语句是 能通过编译 的!
// 但是运行的时候会 出现问题!!---- segmentation fault

// 因为常量无法修改。


// 为了避免这样的错误,要这样写:

// const char *ptr = "David";


// 这时如果再出现类似 “ptr[4] = 'x';” 的,修改内容的语句,
// 编译就不能通过 ,避免运行时程序崩溃。


char sptr[] = "David";

sptr[4] = 'x'; 

// 这样其实是声明了 一个数组大小由后面初始化常量决定     的字符数组变量

// sptr[4] = 'x';  不仅通过编译,而且可以执行。



字符串常量:
  • 类型是char[] (原因不明,没有看到过权威解释,估计是历史遗留。)
  • 连续存储,末尾自动添加\0
  • 静态存储
  • 相同值常量的地址可以不同
  • 修改字符是未定义行为,不可以修改
  • 在内存中唯一存在


另外知识

常量存储总结
局部变量、静态局部变量、全局变量、全局静态变量、字符串常量以及动态申请的内存区


1、局部变量存储在栈中
2、全局变量、静态变量(全局和局部静态变量)存储在静态存储区
3、new申请的内存是在堆中
4、字符串常量也是存储在静态存储区


补充说明:
1、栈中的变量内存会随着定义所在区间的结束自动释放;而对于堆,需要手动free,否则它就一直存在,直到程序结束;
2、对于静态存储区,其中的变量常量在程序运行期间会一直存在,不会释放,且变量常量在其中只有一份拷贝,不会出现相同的变量和常量的不同拷贝。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值