| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1873 人关注过本帖
标题:求解释,关于字符串何时分配空间
只看楼主 加入收藏
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:19 
求解释,关于字符串何时分配空间
和人讨论字符串的问题,自己写代码测试的时候发现个问题
程序代码:
#include<stdio.h>
#include<string.h>
main(){
    char a[]="abcdefg";
    char b[]="xyz";
    strcpy(a,b);
    printf("%s\n%s",a,b);
}
这段代码没问题
程序代码:
#include<stdio.h>
#include<string.h>
main(){
    char *a="abcdefg";
    char *b="xyz";
    strcpy(a,b);
    printf("%s\n%s",a,b);
}
这段代码却会出错,这是不是说明在定义字符指针时直接用字符串初始化,这个字符串没有分配空间啊,可是如果没有分配空间它是怎么存储的呢?

搜索更多相关主题的帖子: 空间 字符串 
2013-01-05 16:07
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:20 
简单说就是 a指向空间的数据你不能修改,所以错了

记得好像叫静态区?忘了,额


[fly]存在即是合理[/fly]
2013-01-05 16:11
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
哎呀,我想起来了常量不在堆栈里,在data区,谢谢谢谢

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-05 16:15
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:0 
我知其然不知其所以然,计算机机理大盲。

www.qunxingw.wang
2013-01-05 16:26
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
这么快就结贴了。。。

百度了下,叫文字常量区。

http://

http://


[fly]存在即是合理[/fly]
2013-01-05 16:26
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
第二篇看的云里雾里的,看不懂啊,坐等大牛


[fly]存在即是合理[/fly]
2013-01-05 16:32
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
貌似我刚才说的不对

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-05 16:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
char a[] = "abcdefg";
这种,是赋值初始化,在定义数组a[]的同时,给它赋值,这个时候,编译器的动作是把常量"abcdefg"逐字符复制赋值到数组a[]中。也就是说,a[]和"abcdefg"是两个不同的数据。

char* a = "abcdefg";
这种,定义a是一个自由指针,指针与数组不同,后者是容器,前者不是,指针是无法同时对应一连串字符的,这个时候,编译器令指针a的值为常量字符串"abcdefg"的入口地址。也就是说,a直接指向"abcdefg",数据只有一个。

第一种写法,数组a[]是把常量数据的内容抄到自己的空间中,这个时候,数组自身的内容是可以改变的。第二种,指针直接指向了只读数据区,无法更改。编译器始终会给常量"abcdefg"分配数据空间,但对第一种,你不妨看看汇编代码,会发现复制的过程,数据有两份,而第二种只有一份。

数组和指针确实是不同的东西,虽然很多时候两者被混用,但它们真的不是同一回事,从这个例子就可以看出来了。

[ 本帖最后由 TonyDeng 于 2013-1-5 17:10 编辑 ]

授人以渔,不授人以鱼。
2013-01-05 17:08
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
我得揣摩一会,不是很好懂啊,谢谢T版

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-05 17:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在C++中,数据的初始化,与C不同,有两种,一种是直接初始化,一种是复制初始化。后者就是你代码中的第一种。对象的初始化值是通过复制操作导入的,而直接初始化,是创建对象的时候就设定好的,两者的效率和功能上区别,C对此模糊不清,你学到C++的时候,就知道其实有这样的区别。

对于常量,其实不同的编译器的也可能有不同的行为。把常量分配在静态只读数据区是通常的行为,但有的编译器会把整个程序中相同的数据合并为一份的,有些未必如此(在逻辑上说,要不要这样合并其实并没充分的理由)。比如,你在两个函数中都写出常量字符串"abcdefg",在道理上,这应该是两个不同的数据,因为两个函数是互相独立的,但编译器可能把这样两个字符串合并为一个,在使用指针的时候,就可能会产生微妙的问题了。

授人以渔,不授人以鱼。
2013-01-05 17:17
快速回复:求解释,关于字符串何时分配空间
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029955 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved