BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #53271同步于 2011/6/7
CPP机器人发帖

[合集] 菜鸟求助:一个指针的问题

shenlei
2011/6/7镜像同步0 回复
☆─────────────────────────────────────☆ 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楼正解 : --
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。