指针和字符串的问题
本帖最后由 sunguangshou 于 2011-04-20 16:33 编辑
一、
char *p="你好";
①//p指针是不是指向一个常量空间?
②//p指针是不是一个野指针呢?
二、
char *p=(char *)malloc(sizeof(char)*5);
p="你好";
①//这样的话是不是每次都要浪费不少空间呢?
请高手能够回答一下。谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
楼主想表达的意思,我看不明白!!!????{:3_198:}{:3_198:}{:3_198:}
1,放在Data Segment里。
2,不是
3,不free肯定不行啥
1不一定
2不是
3是
char *p="你好";
①//p指针是不是指向一个常量空间?
是的,具体来说"你好"是一个字面字符串,本身是常量,会存放在程序的text段,也就是存放程序代码的那个段,这里是只读区域。指针p是栈里的一个变量,它指向那个字面字符串常量。
②//p指针是不是一个野指针呢?
野指针这个东西,我个人认为有素养的程序员,是没有野指针这个概念的。我申请的内存,由我的指针变量来管理,当内存释放之后,那个指针也就废弃了。除非再指向其它可用内存。
③char *p=(char *)malloc(sizeof(char)*5);
p="你好"; //这样的话是不是每次都要浪费不少空间呢?
实际上"你好"还是个字面字符串,编译器一样会把它放在text段中。
char *p=(char *)malloc(sizeof(char)*5); 这里分配了5个字节的堆内存
p="你好"; 这里又把指针指向了上面那个字面字符串常量。
实际上这里的问题不仅仅是浪费了5个字节的内存,更严重的是你泄漏了刚刚申请的5字节堆内存。更更严重的是你可能马上会执行free(p)操作,这几乎肯定会让你的程序报出一个“段错误”而退出。最最严重的是你可能忘了调用free(p)操作,给你的程序留下一个bug,最终客户或老板找上了你!
all!
1不一定 : 是神马意思?我觉得就是的啊?
操作系统、编译器都不确定,所以说不一定
回复 3# zesu
1. 字面字符串常量是在text段中
3. free(p)肯定会出错的
回复 7# hellioncu
这个我还真不知道有哪个系统哪个编译器,字面字符串常量是不在只读text段的
在CONST段。