问题:
void change(char *q)
{
q++;
q++;
printf("%s/n",q);
}
main()
{
char *p=(char *)malloc(32);
p="Hello";
change(p);
printf("%s",p);
getch();
}
是这样的,我想利用change(char *p)来修改 main函数里的p="Hello",
怎么才能通过调用函数使main()里的p=p+2呢?也就是要输出"llo".
还有就是定义char *p,字符串 使用之前必须要malloc吗? 还有什么好办法吗?
回答:
不要以为用指针做参数就是地址传递方式,因为你主函数中的p是指针,要想在函数中改变主函数中指针的值,应该以指针的指针的方式传递参数:
void change( char** q ) {
++*q; //此处不能写成*q++,因为优先级为(! ~ ++ -- + - * (type) sizeof right to left )
++*q;
printf( "%s", *q );
}
int main() {
char* p = "Hello";
change( &p );
printf( "/n%s", p );
}
另外,在定义char* p字符串,在使用之前并不是必须要用malloc(),你的程序就是一个很好的例子,因为"Hello"是一个字符串常量,所有的常量(包括其它数据类型的常量),编译器会自动为它们分配存储空间,不用你来手动申请存储空间,而且你的做法也是导致内存泄漏的典型例子,当你使用char *p=(char *)malloc(32);时系统就会为你分配32个字节,并且使p指向这个存储空间,但当你p="Hello";时,p就会指向"Hello"这个存储空间,p就不再指向那个32个字节的存储空间了,这时你的程序就再也不能利用这个32个字节的存储空间了。避免内存泄漏的做法可以是:
char *p=(char *)malloc(32);
free( p );//在使p指向其它的地方之前释放掉这个多余的空间。
p="Hello";
或者:
char *p=(char *)malloc(32);
char* ch = p;//如果觉得这个空间还有用,可以把它交给别人帮你保管,这样这个空间就不会变成游魂野鬼了。
p = "Hello";