黑马程序员技术交流社区

标题: 字符串数组及字符串指针初始化区别及应用 [打印本页]

作者: zhs    时间: 2014-7-9 09:49
标题: 字符串数组及字符串指针初始化区别及应用
本帖最后由 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所指向的第一个字符的值输出
      
}
运行结果系统会报错。
原因:字符串指针在初始化时存储在常量区,常量区存储的数据作为常量不能改变,而字符串数组在初始化时存储在栈中,栈用来存储变量,可以被改变。
内存解析:
内存分为:常量区、堆、栈
常量区:存储常用的常量
堆:存储对象
栈:存储变量
综上所述:当初始化的字符串需要改变时,使用字符串数组初始化。当初始化的字符串作为常量不需改变时,使用字符串指针初始化
作者: ★Joean_Zhou    时间: 2014-7-9 10:11
分析的很透彻,嘿嘿
作者: Très    时间: 2014-7-9 11:39
分析的很到位,学习了!
作者: 完美世界    时间: 2014-7-9 15:25
我用xcode 编译链接都没有问题,运行也可以输出结果为:
T
Bus error:10

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

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

是会输出T,因为输出T的赋值改变的是字符串数组,初始化的字符串数组的值是可以改变的。而第二个错误是因为程序要把'Z'赋值给字符串指针中的值,而初始化的字符串指针的值是不能改变的,所以报错
作者: hm123tinghai    时间: 2014-7-9 16:12
学习一下。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2