当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 11 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 好玩的C...
帖子发表于 : 2007-11-13 17:57 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
:D 如下:
代码:
lily@LLY:~/test$ cat anagram.c
#include<stdio.h>
#include<string.h>
main(){
        int i,len;char chr;
        //char str[10];
        //strcpy(str,"bones7456");
        char * str="bones7456";
        printf("%s(%d)\n",str,len=strlen(str));
        for(i=0;i < len/2;i++){
                chr=str[i];
                str[i]=str[len-i-1];
                str[len-i-1]=chr;
        }
        printf("%s\n",str);
}
lily@LLY:~/test$ gcc anagram.c
lily@LLY:~/test$ ./a.out
bones7456(9)
段错误 (core dumped)
lily@LLY:~/test$ tcc anagram.c
lily@LLY:~/test$ ./a.out
bones7456(9)
6547senob
lily@LLY:~/test$ vim anagram.c
lily@LLY:~/test$ cat anagram.c
#include<stdio.h>
#include<string.h>
main(){
        int i,len;char chr;
        //char str[10];
        //strcpy(str,"bones7456");
        char str[]="bones7456";
        printf("%s(%d)\n",str,len=strlen(str));
        for(i=0;i < len/2;i++){
                chr=str[i];
                str[i]=str[len-i-1];
                str[len-i-1]=chr;
        }
        printf("%s\n",str);
}
lily@LLY:~/test$ gcc anagram.c
lily@LLY:~/test$ ./a.out
bones7456(9)
6547senob
lily@LLY:~/test$ tcc anagram.c
lily@LLY:~/test$ ./a.out
bones7456(9)
6547senob
lily@LLY:~/test$


http://paste.ubuntu.org.cn/3965 这里有语法高亮的...


_________________
关注我的blog: ε==3


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-11-13 18:29 
头像

注册: 2006-05-03 0:39
帖子: 8273
地址: المريخ
送出感谢: 0 次
接收感谢: 1
:?:


_________________
PHP是最好的语言!不服来战!


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-11-13 19:42 
头像

注册: 2007-06-02 14:56
帖子: 547
送出感谢: 0 次
接收感谢: 0 次
排骨照镜子 --


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-11-13 21:45 
头像

注册: 2005-10-02 8:22
帖子: 723
送出感谢: 0 次
接收感谢: 0 次
上面的那段
代码:
char * str="bones7456";
的确有问题,当时只是指定一个指针,并未分配空间。所以在不同编译器中的结果会不同。一般也不推荐这么写。


_________________
子曰,三人行,必有我师,吾曰,世间万物,皆为我师.


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-11-13 21:46 
头像

注册: 2005-10-02 8:22
帖子: 723
送出感谢: 0 次
接收感谢: 0 次
在优化过后,字符串空间有可能被释放。


_________________
子曰,三人行,必有我师,吾曰,世间万物,皆为我师.


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-11-13 22:39 

注册: 2006-03-19 18:25
帖子: 89
地址: FZ->TJ->PEK->AMS->MTL
送出感谢: 0 次
接收感谢: 0 次
speme 写道:
上面的那段
代码:
char * str="bones7456";
的确有问题,当时只是指定一个指针,并未分配空间。所以在不同编译器中的结果会不同。一般也不推荐这么写。

非也非也!

别的编译器怎么搞偶还真不知道,但感觉好像程序有了错误一定会有人说编译器相关一类的答案。

就楼主的这个问题来说,错误再清楚不过了。"指定了一个指针,并未分配空间",我是横竖没明白楼上的想表达什么。char *str="abcde";的意思是,将str指针指向常量字符串的地址,这个常量字符串是在程序中的text段中的,是编译期间就分配好的,怎么说是没有分配呢?也不会在运行期间被释放掉,那是程序的正文段噎。之所以出现段错误,道理一简单不过了,你试图修改正文段,也就是那个常量字符串的值,严重的非法操作;) 为什么 char str[] = "abcde";可以?答案也很简单,char str[] = "abcde"; 实际上在栈里分配了一段空间,将abcde的值拷贝进去,而后你的写操作都是在自己的栈里进行的,完全合法,这和char *str = "abcde";的直接指向是不同的。


最后由 vupiggy 编辑于 2007-11-13 22:45,总共编辑了 1 次

页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-11-13 22:42 

注册: 2006-03-19 18:25
帖子: 89
地址: FZ->TJ->PEK->AMS->MTL
送出感谢: 0 次
接收感谢: 0 次
用size看看你编译生成的elf文件的大小,用objdump看一下各个段,就很清楚了。


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-11-13 23:03 

注册: 2006-09-20 19:56
帖子: 768
送出感谢: 0 次
接收感谢: 1
楼上正解,无论在哪个编译器下,指向字符串常量的指针的指向内容都是分配在只读段中的,VC将其分配到了.rdata中。


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2007-11-13 23:13 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
这还要调试啊。*str就是指向代码段内部的。没分配空间。不是yxxxx在问过?怎么是排骨写的?


_________________
● 鸣学


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2007-11-14 11:33 
头像

注册: 2006-02-27 20:19
帖子: 599
地址: works system
送出感谢: 0 次
接收感谢: 0 次
zhangsong023 写道:
楼上正解,无论在哪个编译器下,指向字符串常量的指针的指向内容都是分配在只读段中的,VC将其分配到了.rdata中。

确定??记得貌似在vxworks下好像字符串常量就不是只读的呢?


_________________
东西路,南北走
十字路口人咬狗
拿起狗来打砖头
砖头咬了狗一口
图片


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2007-11-14 15:26 

注册: 2006-09-20 19:56
帖子: 768
送出感谢: 0 次
接收感谢: 1
楼上做嵌入式的?
我知道在DOS中也是可以写的,那应该是16位系统的内存保护机制问题,不是C设计此一语法的本义。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 11 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译