好玩的C...

软件和网站开发以及相关技术探讨
回复
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

好玩的C...

#1

帖子 bones7456 » 2007-11-13 17:57

: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
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#2

帖子 stlxv » 2007-11-13 18:29

:?:
PHP是最好的语言!不服来战!
头像
ofewiofewo
帖子: 547
注册时间: 2007-06-02 14:56

#3

帖子 ofewiofewo » 2007-11-13 19:42

排骨照镜子 --
头像
speme
帖子: 723
注册时间: 2005-10-02 8:22
联系:

#4

帖子 speme » 2007-11-13 21:45

上面的那段

代码: 全选

char * str="bones7456";
的确有问题,当时只是指定一个指针,并未分配空间。所以在不同编译器中的结果会不同。一般也不推荐这么写。
子曰,三人行,必有我师,吾曰,世间万物,皆为我师.
头像
speme
帖子: 723
注册时间: 2005-10-02 8:22
联系:

#5

帖子 speme » 2007-11-13 21:46

在优化过后,字符串空间有可能被释放。
子曰,三人行,必有我师,吾曰,世间万物,皆为我师.
vupiggy
帖子: 89
注册时间: 2006-03-19 18:25
来自: FZ->TJ->PEK->AMS->MTL

#6

帖子 vupiggy » 2007-11-13 22:39

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 次。
vupiggy
帖子: 89
注册时间: 2006-03-19 18:25
来自: FZ->TJ->PEK->AMS->MTL

#7

帖子 vupiggy » 2007-11-13 22:42

用size看看你编译生成的elf文件的大小,用objdump看一下各个段,就很清楚了。
zhangsong023
帖子: 768
注册时间: 2006-09-20 19:56

#8

帖子 zhangsong023 » 2007-11-13 23:03

楼上正解,无论在哪个编译器下,指向字符串常量的指针的指向内容都是分配在只读段中的,VC将其分配到了.rdata中。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#9

帖子 eexpress » 2007-11-13 23:13

这还要调试啊。*str就是指向代码段内部的。没分配空间。不是yxxxx在问过?怎么是排骨写的?
● 鸣学
头像
madoldman
帖子: 599
注册时间: 2006-02-27 20:19
来自: works system
联系:

#10

帖子 madoldman » 2007-11-14 11:33

zhangsong023 写了:楼上正解,无论在哪个编译器下,指向字符串常量的指针的指向内容都是分配在只读段中的,VC将其分配到了.rdata中。
确定??记得貌似在vxworks下好像字符串常量就不是只读的呢?
东西路,南北走
十字路口人咬狗
拿起狗来打砖头
砖头咬了狗一口
图片
zhangsong023
帖子: 768
注册时间: 2006-09-20 19:56

#11

帖子 zhangsong023 » 2007-11-14 15:26

楼上做嵌入式的?
我知道在DOS中也是可以写的,那应该是16位系统的内存保护机制问题,不是C设计此一语法的本义。
回复