日期:2014-05-16  浏览次数:20699 次

字符串操作(读写在内存中)的问题?
#include   <stdio.h>
void   copy_string(char   *from,char   *to)
{
      for(;*from!= '\0 ';from++,to++)
              *to=*from;
      *to= '\0 ';
}
int   main(int   argc,char   *argv[])
{
        char   *str1= "123456789 ";
        char   *str2= "abcdefg ";
        copy_string(str2,str1);
        printf( "%s\n ",str1);
        return   0;
}
(1)以上代码在TC2.0下可以正常通过执行,但在VS2005中不能通过.linux下能编译(gcc),但执行提示段错误!如果把char   *str1该为char   str1[]在VS2005和linux下就都正常了!为什么?
(2)用char   *str定义的字符串好象不能往里写只能读,而用char   str[]定义的字符串就可以读也可以写.如何来判断一个char指针是用char   *定义的还是用char   []来定义的呢?
谢谢了!

------解决方案--------------------
char str1[]= "123456789 ";
char str2[32]= "abcdefg ";
常量字符串不可改写的

------解决方案--------------------
char *str2= "abcdefg ";
这个是指向常量的字符串
char str2[32]= "abcdefg ";
这个是你自己定义的数组,用一个常量字符串初始化了.
------解决方案--------------------

char *str2= "abcdefg ";
这个是指向常量的字符串
char str2[32]= "abcdefg ";
这个是你自己定义的数组,用一个常量字符串初始化了.
----------------------
正解。
指针和数组都是都是存放的一个地址,通过函数调用后,从理论上说是一样的,都是一个地址,没法区分。要依赖于编写代码的人和编译器来区分,不过对于编译器的检查,有很多方法可以绕过去。
------解决方案--------------------
TC能运行通过的原因是:DOS对内存没有保护。
------解决方案--------------------
TC是一个很弱的编译器,里面的很多内存方面的问题都没有检查。你能编译过,不代表执行结果也如你所想,执行结果也如你所想,并不代表每次执行结果都是正确的,说不定下次执行的时候内存就出了问题。VC和GCC都是强编译器。

char * 和char []那就是C语言的基本功的问题了。。。
前者是放在静态存储区里的,不可更改的,后者则是系统分配的内存,在堆栈里的,是可写的。