首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求教解决思路

2012-03-06 
求教voidGetString2(char*s){s abc }voidmain(void){char*str 12334 GetString2(str)printf( st

求教
void     GetString2(char   *s)
{
        s= "abc ";
}
 
void   main(void)

{
        char   *str= "12334 ";
        GetString2(str);
        printf   ( "str   =   %s   \n ",   str);
        getch();
}

这题结果是什么呢,为什么?

[解决办法]
结果是 str = 12334
函数对参数的操作并非直接对参数操作,而是对参数的副本操作,这些操作都是编译器完成的,编程的人操作函数中的参数实际上是操作参数的副本,所以改变参数指针的指向也就是改变副本的指向,对参数本身并不造成影响。但是如果不是改变指针的指向,而是改变指针指向的内容,由于参数和副本都指向相同的内容,所以改变副本指向的内容也就相当于改变参数的指向内容。
void GetString2(char *s)
{
s= "abc ";
}
被编译器解析为
void GetString2(char *s)
{
char *_s = s; //生成参数副本
_s= "abc "; //这里实际上是改变副本的指向,实际参数指向并没有改变
//但是如果是*_s= '1 '; 那么*s也等于 '1 ',因为_s和s指向的地址一样,所以在函数内部改变函数指针指向是不会对实际参数的指向造成影响的
}



[解决办法]
楼上正解!
s= "abc ",把s的指向地址空间改变了。

看这个程序,感觉没什么意义,因为输出明显和子程序没关系,估计楼主是想通过子程序给str赋值吧!如果真是要赋值的话有几点要注意;
1、s= "abc " //应该是*s=....,但是数组不能整体赋值,只能拷贝或循环赋值
*s=‘a’,可以;strcpy(s, "abc ")可以,但是都要注意s的长度不能超过主函数中的str,否则就越界了,会把堆栈中另外的值覆盖掉。下面的代码就不会覆盖别的数据:
void GetString2(char *s)
{
char len=strlen(s); //测量str的长度
while(len--)
*(s++)= 'a '; //把str的空间全部改称‘a’
}

int main(void)
{
char str[]= "1234567 "; //注意这里的str是数组(数据在栈内,可读写),如果是指针
GetString2(str); //(*s= "1234567 ")则数据在静态区只能读不能写,否则程序会出错。
printf ( "str = %s \n ", str);
getch();
return;
}

热点排行