A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 zhs 于 2014-7-9 11:37 编辑

#include <stdio.h>
int main()
{
       char arr[]="itcast";
       arr[0]='T';
       printf("%c\n",arr[0]);//字符串数组创建并初始化及改变数组首个元素值输出
       char *p="itcast";
        *p='Z';
        printf("%c\n",*p);//字符串指针创建并初始化及改变指针变量p所指向的第一个字符的值输出
      
}
运行结果系统会报错。
原因:字符串指针在初始化时存储在常量区,常量区存储的数据作为常量不能改变,而字符串数组在初始化时存储在栈中,栈用来存储变量,可以被改变。
内存解析:
内存分为:常量区、堆、栈
常量区:存储常用的常量
堆:存储对象
栈:存储变量
综上所述:当初始化的字符串需要改变时,使用字符串数组初始化。当初始化的字符串作为常量不需改变时,使用字符串指针初始化

6 个回复

倒序浏览
分析的很透彻,嘿嘿
回复 使用道具 举报
分析的很到位,学习了!
回复 使用道具 举报
我用xcode 编译链接都没有问题,运行也可以输出结果为:
T
Bus error:10

有没有知道这什么意思的?
回复 使用道具 举报
完美世界 发表于 2014-7-9 15:25
我用xcode 编译链接都没有问题,运行也可以输出结果为:
T
Bus error:10

:L lz的程序本来就没法运行啊,他就是要证明字符串常量是不可以修改的。*p='z'是非法操作
回复 使用道具 举报
完美世界 发表于 2014-7-9 15:25
我用xcode 编译链接都没有问题,运行也可以输出结果为:
T
Bus error:10

是会输出T,因为输出T的赋值改变的是字符串数组,初始化的字符串数组的值是可以改变的。而第二个错误是因为程序要把'Z'赋值给字符串指针中的值,而初始化的字符串指针的值是不能改变的,所以报错
回复 使用道具 举报
学习一下。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马