当前位置: 技术问答>linux和unix
字符串操作(读写在内存中)的问题?
来源: 互联网 发布时间:2016-02-01
本文导语: #include void copy_string(char *from,char *to) { for(;*from!='';from++,to++) *to=*from; *to=''; } int main(int argc,char *argv[]) { char *str1="123456789"; char *str2="abcdefg"; copy_string(str2,str1); printf("%sn",st...
#include
void copy_string(char *from,char *to)
{
for(;*from!='';from++,to++)
*to=*from;
*to='';
}
int main(int argc,char *argv[])
{
char *str1="123456789";
char *str2="abcdefg";
copy_string(str2,str1);
printf("%sn",str1);
return 0;
}
(1)以上代码在TC2.0下可以正常通过执行,但在VS2005中不能通过.linux下能编译(gcc),但执行提示段错误!如果把char *str1该为char str1[]在VS2005和linux下就都正常了!为什么?
(2)用char *str定义的字符串好象不能往里写只能读,而用char str[]定义的字符串就可以读也可以写.如何来判断一个char指针是用char *定义的还是用char []来定义的呢?
谢谢了!
void copy_string(char *from,char *to)
{
for(;*from!='';from++,to++)
*to=*from;
*to='';
}
int main(int argc,char *argv[])
{
char *str1="123456789";
char *str2="abcdefg";
copy_string(str2,str1);
printf("%sn",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[32]="abcdefg";
常量字符串不可改写的
|
char *str2="abcdefg";
这个是指向常量的字符串
char str2[32]="abcdefg";
这个是你自己定义的数组,用一个常量字符串初始化了.
这个是指向常量的字符串
char str2[32]="abcdefg";
这个是你自己定义的数组,用一个常量字符串初始化了.
|
char *str2="abcdefg";
这个是指向常量的字符串
char str2[32]="abcdefg";
这个是你自己定义的数组,用一个常量字符串初始化了.
----------------------
正解。
指针和数组都是都是存放的一个地址,通过函数调用后,从理论上说是一样的,都是一个地址,没法区分。要依赖于编写代码的人和编译器来区分,不过对于编译器的检查,有很多方法可以绕过去。
|
TC能运行通过的原因是:DOS对内存没有保护。
|
TC是一个很弱的编译器,里面的很多内存方面的问题都没有检查。你能编译过,不代表执行结果也如你所想,执行结果也如你所想,并不代表每次执行结果都是正确的,说不定下次执行的时候内存就出了问题。VC和GCC都是强编译器。
char * 和char []那就是C语言的基本功的问题了。。。
前者是放在静态存储区里的,不可更改的,后者则是系统分配的内存,在堆栈里的,是可写的。
char * 和char []那就是C语言的基本功的问题了。。。
前者是放在静态存储区里的,不可更改的,后者则是系统分配的内存,在堆栈里的,是可写的。