返回信息流☆─────────────────────────────────────☆
llchen (风雨如晦,鸡鸣不已) 于 (Sun Jun 5 21:24:58 2011) 提到:
main()
{
char *s="www.baidu.com";
char *t="www.google.com";
strcat(s,t);
printf(s);
}
为何打印不出来s呢?
☆─────────────────────────────────────☆
chinapds (星宇) 于 (Sun Jun 5 22:08:42 2011) 提到:
lz能编译通过吗……
【 在 llchen (风雨如晦,鸡鸣不已) 的大作中提到: 】
: main()
: {
: char *s="www.baidu.com";
: ...................
☆─────────────────────────────────────☆
llchen (风雨如晦,鸡鸣不已) 于 (Sun Jun 5 22:38:42 2011) 提到:
【 在 chinapds 的大作中提到: 】
: lz能编译通过吗……
: 【 在 llchen (风雨如晦,鸡鸣不已) 的大作中提到: 】
: : main()
: ...................
就是编译不过啊 把*s换成s[]才行 不知道为什么?
☆─────────────────────────────────────☆
chinapds (星宇) 于 (Sun Jun 5 22:55:51 2011) 提到:
看出错信息,能搜到好多东西,貌似是段错误啥的,和指针操作有关。
【 在 llchen (风雨如晦,鸡鸣不已) 的大作中提到: 】
: 就是编译不过啊 把*s换成s[]才行 不知道为什么?
☆─────────────────────────────────────☆
ltmit (ltmit) 于 (Sun Jun 5 23:07:34 2011) 提到:
看到问这个问题,我就不三言两语解释了。
建议lz深入研究理解代码后面数据在内存中的存放方式。常量和变量。
网上讲的很多,有的透有的乱,多看看吧。
☆─────────────────────────────────────☆
feng525770 (|Kristy) 于 (Sun Jun 5 23:11:43 2011) 提到:
char *s = "www.baidu.com"
char s[] = "www.baidu.com"
我能想到的唯一区别就是字符串存放位置的差别
【 在 llchen 的大作中提到: 】
: main()
: {
: char *s="www.baidu.com";
: ...................
☆─────────────────────────────────────☆
shenyangsy (sy) 于 (Sun Jun 5 23:26:18 2011) 提到:
因为你的S的数组大小不够,你要把t中的字符串加到s字符串的后面,可是你的s字符数组大小不够,所以出现内存问题,而C是不做越界处理的,你把s改成100的数组时,大小够了,就能装下,结果就正确了
☆─────────────────────────────────────☆
YeeBoo (YeeBoo) 于 (Sun Jun 5 23:54:06 2011) 提到:
6楼正解
☆─────────────────────────────────────☆
renne (歼灭天使 玲) 于 (Mon Jun 6 00:02:33 2011) 提到:
如果你不确定 就别说出来误导人
【 在 shenyangsy (sy) 的大作中提到: 】
: 因为你的S的数组大小不够,你要把t中的字符串加到s字符串的后面,可是你的s字符数组大小不够,所以出现内存问题,而C是不做越界处理的,你把s改成100的数组时,大小够了,就能装下,结果就正确了
☆─────────────────────────────────────☆
shenyangsy (sy) 于 (Mon Jun 6 00:14:38 2011) 提到:
【 在 renne 的大作中提到: 】
: 如果你不确定 就别说出来误导人
: 【 在 shenyangsy (sy) 的大作中提到: 】
: : 因为你的S的数组大小不够,你要把t中的字符串加到s字符串的后面,可是你的s字符数组大小不够,所以出现内存问题,而C是不做越界处理的,你把s改成100的数组时,大小够了,就能装下,结果就正确了
: ...................
?不是这个原因吗,好吧,我错了
☆─────────────────────────────────────☆
andy205214 (andy205214) 于 (Mon Jun 6 00:18:38 2011) 提到:
【 在 chinapds 的大作中提到: 】
: lz能编译通过吗……
: 【 在 llchen (风雨如晦,鸡鸣不已) 的大作中提到: 】
: : main()
: ...................
为何编译不过?
☆─────────────────────────────────────☆
nevermadao ([—哗]) 于 (Mon Jun 6 00:27:43 2011) 提到:
lz可以百度一下“字面量”
☆─────────────────────────────────────☆
YiSu0YanYu (一蓑烟雨) 于 (Mon Jun 6 01:17:15 2011) 提到:
简单说
char * 表示的字符串存储在只读区域
【 在 llchen 的大作中提到: 】
: main()
: {
: char *s="www.baidu.com";
: ...................
☆─────────────────────────────────────☆
oonlyyou (haha) 于 (Mon Jun 6 01:31:03 2011) 提到:
lz, char *s 这样定义造成s是一个字符常量,char s[]是变量,常量不能改变,变量才能改变,左值不能为常量,右值可以
☆─────────────────────────────────────☆
UZ (柚子) 于 (Mon Jun 6 01:33:51 2011) 提到:
存放位置的不同。根本就不能这么用。
☆─────────────────────────────────────☆
wolfFN (北方的狼||我是娜姐头号粉丝||cat是我妹) 于 (Mon Jun 6 01:38:57 2011) 提到:
*S 介个要先分配存储空间?
☆─────────────────────────────────────☆
daddy (daywalker) 于 (Mon Jun 6 01:53:50 2011) 提到:
看看strcat源码就知道了
char * strcat(char * dest, const char * src)
{
char *tmp = dest;
while (*dest)
dest++;
while ((*dest++ = *src++) != '\0')
;
return tmp;
}
main()
{
char *s="www.baidu.com";
char *t="www.google.com";
strcat(s,t);
printf(s);
}
首先是越界了,s的'\0'后面没法写
然后,两个字符串存储在常量区本身就是只读的,即使不越界也不能写 s[0] = 'x' //error
char s[] = "www.baidu.com";
这样s[i]是可写的,但是数组长度不够会越界,所以弄大一点s[100]
【 在 wolfFN 的大作中提到: 】
: *S 介个要先分配存储空间?
: --
☆─────────────────────────────────────☆
fifthday (老虎不喵喵你当我病危阿) 于 (Mon Jun 6 03:00:32 2011) 提到:
定义的s是常量字符串,不能更改内容。不是指针的问题,存放常量的那块内存是不能改的
☆─────────────────────────────────────☆
CLegend (皮波) 于 (Mon Jun 6 08:29:37 2011) 提到:
s在常量区,不可写
☆─────────────────────────────────────☆
hxc (哈哈) 于 (Mon Jun 6 09:46:26 2011) 提到:
常量可写咩?
☆─────────────────────────────────────☆
yf341 (BeYond) 于 (Mon Jun 6 09:47:46 2011) 提到:
【 在 oonlyyou 的大作中提到: 】
: lz, char *s 这样定义造成s是一个字符常量,char s[]是变量,常量不能改变,变量才能改变,左值不能为常量,右值可以
: --
赞,正解
☆─────────────────────────────────────☆
DOS (呱呱小杰) 于 (Mon Jun 6 09:52:31 2011) 提到:
char *s = "www.baidu.com"
这样的话www.baidu.com放在常量区,故不可改变
☆─────────────────────────────────────☆
myou (纯净半方糖) 于 (Mon Jun 6 09:53:30 2011) 提到:
现如今…
☆─────────────────────────────────────☆
kaokao2011 (江南西道|要给力) 于 (Mon Jun 6 09:58:26 2011) 提到:
哇,16L的挺详细的
☆─────────────────────────────────────☆
chuckszy (毛毛) 于 (Mon Jun 6 10:38:00 2011) 提到:
我觉得
char *s = "hello world!";
"hello world!"被存储在静态数据区,s就是个指针,指向这个区域。
s是一个属于main()函数的局部变量,该地址在栈上面,出了这个main()就无效了
不知道理解的对不?
☆─────────────────────────────────────☆
ltmit (ltmit) 于 (Mon Jun 6 10:53:18 2011) 提到:
。。。。。。
早就可以预料一些自己都半懂不懂的出来哇啦哇啦。
lz还是听我建议去网上自己找资料吧。毕竟那些正规挂出来的东西是经过群众检验的。
☆─────────────────────────────────────☆
yourwangzi ( 光棍哥求分手) 于 (Mon Jun 6 11:08:21 2011) 提到:
char * s所指的内存是在 程序 的 只写数据区 里。你把字符串连接到它的后面会编译报错。
char s[]所指的内存是在 程序 的 栈 里。函数内的栈是临时的。
【 在 llchen 的大作中提到: 】
: main()
: {
: char *s="www.baidu.com";
: ...................
☆─────────────────────────────────────☆
shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Mon Jun 6 11:22:14 2011) 提到:
内牛满面…
☆─────────────────────────────────────☆
aaaaaa (风之痕) 于 (Mon Jun 6 11:23:20 2011) 提到:
额。。建议楼主 好好把 , 内存模型这块好好看看, 以后 找工作啥的, 经常会 考的。。。
☆─────────────────────────────────────☆
czsilence (·SILENCE·) 于 (Mon Jun 6 11:42:49 2011) 提到:
显然 "www.baidu.com"是const char*
☆─────────────────────────────────────☆
lvweihao (lvweihao) 于 (Mon Jun 6 11:51:03 2011) 提到:
re,参见《C专家编程》运行时的数据结构。
【 在 aaaaaa 的大作中提到: 】
: 额。。建议楼主 好好把 , 内存模型这块好好看看, 以后 找工作啥的, 经常会 考的。。。
: --
☆─────────────────────────────────────☆
fengyetian (枫叶天) 于 (Mon Jun 6 12:36:07 2011) 提到:
re
【 在 shenyangsy 的大作中提到: 】
: 因为你的S的数组大小不够,你要把t中的字符串加到s字符串的后面,可是你的s字符数组大小不够,所以出现内存问题,而C是不做越界处理的,你把s改成100的数组时,大小够了,就能装下,结果就正确了
: --
☆─────────────────────────────────────☆
longbaoer (龙宝儿) 于 (Mon Jun 6 13:13:28 2011) 提到:
#include <iostream>
#include <cstring>
using namespace std;
void main(void){
char s[100]="www.baidu.com";
char* t="www.google.com";
strcat_s(s,100,t);
cout<<s<<endl;
}
☆─────────────────────────────────────☆
longbaoer (龙宝儿) 于 (Mon Jun 6 13:21:38 2011) 提到:
#include <iostream>
#include <string>
using namespace std;
void main(){
string s("www.baidu.com");
string t("www.google.com");
cout<<s+t<<endl;
}
☆─────────────────────────────────────☆
hoho568 (冬风北吹) 于 (Mon Jun 6 13:56:41 2011) 提到:
字符指针你竟然拿字符串赋值,明显有问题吗。。
☆─────────────────────────────────────☆
zhaojf30 (不明真相的群众) 于 (Mon Jun 6 14:29:07 2011) 提到:
窃以为是LZ的字符串放在只读区了
☆─────────────────────────────────────☆
zthwell (圣西罗守护神) 于 (Mon Jun 6 14:56:04 2011) 提到:
#include <string>
#include <iostream>
using namespace std;
//#include <stdlib.h>
void main()
{
char *s="abc";
char *t="efg";
char *p;
p=(char*)malloc(sizeof(s)+sizeof(t));
strcpy(p,s);
strcat(p,t);
s=p;
cout<<s<<endl;
}
☆─────────────────────────────────────☆
zxsword (小绝) 于 (Mon Jun 6 16:47:14 2011) 提到:
同之前的上十大技术贴相比,这个略显尴尬=。=
【 在 shenlei 的大作中提到: 】
: 内牛满面…
: --
☆─────────────────────────────────────☆
ffantastic (袋々鼠) 于 (Mon Jun 6 16:57:11 2011) 提到:
S指向常量区……不能通过间接访问去更改常量区的数值
☆─────────────────────────────────────☆
myself333 (巴渝人家|毅执追球) 于 (Mon Jun 6 18:33:33 2011) 提到:
不懂 帮顶
【 在 llchen (风雨如晦,鸡鸣不已) 的大作中提到: 】
: main()
: {
: char *s="www.baidu.com";
: ...................
☆─────────────────────────────────────☆
mysunshine (果果) 于 (Mon Jun 6 21:08:10 2011) 提到:
常量指针,内容不可修改
☆─────────────────────────────────────☆
woniuxu (蜗牛) 于 (Mon Jun 6 21:26:13 2011) 提到:
【 在 mysunshine 的大作中提到: 】
: 常量指针,内容不可修改
: --
惊现果果师姐~
☆─────────────────────────────────────☆
wzw880311 (春雷夏雪) 于 (Mon Jun 6 22:00:03 2011) 提到:
学习了~
☆─────────────────────────────────────☆
luzheng (jjk) 于 (Mon Jun 6 22:31:00 2011) 提到:
【 在 shenyangsy 的大作中提到: 】
: 因为你的S的数组大小不够,你要把t中的字符串加到s字符串的后面,可是你的s字符数组大小不够,所以出现内存问题,而C是不做越界处理的,你把s改成100的数组时,大小够了,就能装下,结果就正确了
: --
赞一个!
☆─────────────────────────────────────☆
panic (Don't panic||Fly) 于 (Mon Jun 6 22:54:40 2011) 提到:
用C++吧..用string吧..
☆─────────────────────────────────────☆
jkfbrant (迦楼罗) 于 (Mon Jun 6 23:33:54 2011) 提到:
指针使用前要申请内存
【 在 llchen 的大作中提到: 】
: main()
: {
: char *s="www.baidu.com";
: ...................
☆─────────────────────────────────────☆
txmm (你被tx啦!) 于 (Mon Jun 6 23:57:49 2011) 提到:
。。。介个。。。
☆─────────────────────────────────────☆
panic (Don't panic||Fly) 于 (Tue Jun 7 00:27:57 2011) 提到:
嗯,这的确是一个隐藏的bug
【 在 jkfbrant 的大作中提到: 】
: 指针使用前要申请内存
: 【 在 llchen 的大作中提到: 】
: : main()
: ...................
☆─────────────────────────────────────☆
oonlyyou (haha) 于 (Tue Jun 7 00:32:30 2011) 提到:
【 在 txmm 的大作中提到: 】
: 。。。介个。。。
: --
又见腾讯mm
☆─────────────────────────────────────☆
gaoweiwei (三生三世) 于 (Tue Jun 7 02:17:27 2011) 提到:
【 在 shenyangsy 的大作中提到: 】
: 因为你的S的数组大小不够,你要把t中的字符串加到s字符串的后面,可是你的s字符数组大小不够,所以出现内存问题,而C是不做越界处理的,你把s改成100的数组时,大小够了,就能装下,结果就正确了
: --
唉,你亮了
☆─────────────────────────────────────☆
littlefly (小苍) 于 (Tue Jun 7 07:48:26 2011) 提到:
爬到这里我露出了会心的笑容。
【 在 YeeBoo 的大作中提到: 】
: 6楼正解
: --
这是一条镜像帖。来源:北邮人论坛 / cpp / #53271同步于 2011/6/7
CPP机器人发帖
[合集] 菜鸟求助:一个指针的问题
shenlei
2011/6/7镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。