免费注册 查看新帖 |

Chinaunix

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

关于字符串的一个疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-31 14:45 |只看该作者 |倒序浏览

  1.       1 #include<string.h>;
  2.       2 #include<stdio.h>;
  3.       3 int
  4.       4 main(){
  5.       5         char * s="you are my fire the one desire!";
  6.       6         char * ptr;
  7.       7 /*      printf("here1\n");*/
  8.       8         ptr=strtok(s," ");
  9.       9         while(ptr){
  10.      10                 printf("%s\n",ptr);
  11.      11                 ptr=strtok(NULL," ");
  12.      12         }
  13.      13         return 0;
  14.      14 }
复制代码


  1.       1 #include<string.h>;
  2.       2 #include<stdio.h>;
  3.       3 int
  4.       4 main(){
  5.       5         char  s[]="you are my fire the one desire!";
  6.       6         char * ptr;
  7.       7 /*      printf("here1\n");*/
  8.       8         ptr=strtok(s," ");
  9.       9         while(ptr){
  10.      10                 printf("%s\n",ptr);
  11.      11                 ptr=strtok(NULL," ");
  12.      12         }
  13.      13         return 0;
  14.      14 }

复制代码


以上两段代码中对字符串的定义方式不同,第一个编译执行时提示“段错误”,而第二个则可以顺利执行,两个定义主要区别是什么?

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
2 [报告]
发表于 2005-07-31 16:13 |只看该作者

关于字符串的一个疑问

第一个是常量,第二个是变量

论坛徽章:
0
3 [报告]
发表于 2005-07-31 16:27 |只看该作者

关于字符串的一个疑问

如果第一个指字符首地址是常量的话,那第二个s也应该是数组的首地址,而且数组的成员也应该是确定的,应该也是常量吧

论坛徽章:
0
4 [报告]
发表于 2005-07-31 17:11 |只看该作者

关于字符串的一个疑问

第一种情况的存储分配机制是定义了一个字符串指针s,占四个字节,它的值是一个在进程堆的常量存储区的字符串的首地址.

第二种情况的存储分配机制是定义了一个字符数组,并且分配了33个字节的存储空间,并将这片存储区初始化成字符串的值,已'\0'结束,这是在堆栈里分配的.

由于strtok属于一个破坏性的函数,它要对存储区进行修改,操作系统是不允许你对只读存储区进行修改的,所以段异常.

第一个s本身是一个指针变量,但它指向的存储区是只读存储区.

第二个s是一个常量(数组名),它所指向的存储区是可修改的.

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
5 [报告]
发表于 2005-07-31 17:11 |只看该作者

关于字符串的一个疑问

关于这个问题C版讨论很多次了,你可以翻翻以前的旧帖。或许精华里面有。

论坛徽章:
0
6 [报告]
发表于 2005-07-31 21:23 |只看该作者

关于字符串的一个疑问

原帖由 "renstone921" 发表:
第一种情况的存储分配机制是定义了一个字符串指针s,占四个字节,它的值是一个在进程堆的常量存储区的字符串的首地址.

第二种情况的存储分配机制是定义了一个字符数组,并且分配了33个字节的存储空间,并将这片存储区..........


原来如此,谢谢了

论坛徽章:
0
7 [报告]
发表于 2005-07-31 21:36 |只看该作者

关于字符串的一个疑问

解释精确

论坛徽章:
0
8 [报告]
发表于 2005-08-01 11:39 |只看该作者

关于字符串的一个疑问

原帖由 "renstone921" 发表:
第一种情况的存储分配机制是定义了一个字符串指针s,占四个字节,它的值是一个在进程堆的常量存储区的字符串的首地址.

第二种情况的存储分配机制是定义了一个字符数组,并且分配了33个字节的存储空间,并将这片存储区..........

还有一点,第一种情况字符串占四个字节是因为它是一个32位指针吧

一般定义字符串变量就是第二种情况吗?有没有别的定义方式?

论坛徽章:
0
9 [报告]
发表于 2005-08-01 11:57 |只看该作者

关于字符串的一个疑问

动态内存分配
malloc

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
10 [报告]
发表于 2005-08-01 11:58 |只看该作者

关于字符串的一个疑问

原帖由 "homesp" 发表:

还有一点,第一种情况字符串占四个字节是因为它是一个32位指针吧
一般定义字符串变量就是第二种情况吗?有没有别的定义方式?


字符串就是字符串 指针就是指针
串长度就是you are my fire the one desire
指针就是32位(当然与机器有关)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP