字符串操作(读写在内存中)的问题?
#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语言的基本功的问题了。。。
前者是放在静态存储区里的,不可更改的,后者则是系统分配的内存,在堆栈里的,是可写的。