免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2944 | 回复: 12
打印 上一主题 下一主题

老问题,字符串指针 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-24 18:11 |只看该作者 |倒序浏览
#include <stdio.h>

main()
{
    char *str = "hello";

    printf("[%d][%s]\n",strlen(str),str);

    strcpy(str,"123456789");
    printf("[%d][%s]\n",strlen(str),str);
}

好像str指向的内容是存放在堆空间上的,怎么解释上面str指向的空间可以随意变长问题,望高人指点。

论坛徽章:
0
2 [报告]
发表于 2008-04-24 18:13 |只看该作者
只读区

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2008-04-24 18:16 |只看该作者
hello是放在代码段的。这个是否出问题,要看你延长的部分字串是否踩到了地雷了。

论坛徽章:
0
4 [报告]
发表于 2008-04-24 18:42 |只看该作者
到底是放在代码段还是只读数据段。。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2008-04-24 18:45 |只看该作者
错误的程序未必一定会得到错误的结果。

论坛徽章:
0
6 [报告]
发表于 2008-04-24 18:47 |只看该作者
原帖由 aero 于 2008-4-24 18:16 发表
hello是放在代码段的。这个是否出问题,要看你延长的部分字串是否踩到了地雷了。



rodata段应该是不可写的吧,所以即便是
char *str="abc";
strcpy(str,"1" )  //执行这句话的时候还是会出现SIGSEGV segmentation fault ,因为“abc”这部分内存已经被标记为 readonly了
puts(str);

论坛徽章:
0
7 [报告]
发表于 2008-04-24 19:37 |只看该作者
>> 好像str指向的内容是存放在堆空间上的,怎么解释上面str指向的空间可以随意变长问题

字符串字面量是一个静态对象,不是动态对象,所以它在实现上不会放在堆空间上。

str 指向的空间还是那个空间,没有变。如果你上面的程序执行过程中不出现错误,那么是 str 指向的字符串的内容变了,包括其长度发生了变化;如果程序发生了运行错误,那么字符串没有被改变成功。

>> hello是放在代码段的。这个是否出问题,要看你延长的部分字串是否踩到了地雷了。

如果是在代码段,一般会出现运行问题,因为在一般的操作系统上代码段都是受到保护的。

>> 到底是放在代码段还是只读数据段。。。

这取决于具体实现。可能放在代码段(很少见),可能放在数据段;如果是数据段,可能放在只读数据段,也可能放在可读写数据段。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2008-04-24 19:53 |只看该作者
,是的,代码段一般情况下是只读的。但并不是标准,也不是规定,更有代码段可写的常见系统。so……

论坛徽章:
0
9 [报告]
发表于 2008-04-24 20:49 |只看该作者
受益!借着这贴再问个问题
const char * ptr = "HELLO";       /* --1-- */
char const * const ptr = "HELLO"; /* --2-- */

/*
   通过*ptr 或者ptr[0]均不能该ptr指向的内容
   为什么strcpy(ptr,"12345");又可以呢
*/

论坛徽章:
0
10 [报告]
发表于 2008-04-25 10:36 |只看该作者
原帖由 rock_jq 于 2008-4-24 20:49 发表
受益!借着这贴再问个问题
const char * ptr = "HELLO";       /* --1-- */
char const * const ptr = "HELLO"; /* --2-- */

/*
   通过*ptr 或者ptr[0]均不能该ptr指向的内容
   为什么strcpy(ptr, ...

这么写有什么意义? 传ptr给strcpy, 函数的执行结果是不可预知的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP