题目:
请问运⾏Test 函数会有什么样的结果?
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
int main()
{
Test();
return 0;
}
代码分析:
- 调用函数Test ,随后将char类型的指针str=NULL赋值
- 在Test中调用了GetMemory函数
- 在GetMemory函数中进行了申请空间一百个字节
- 又返回Test函数,进行strcpy将hello world这一串字符串拷贝到了空间str中
- 最后输出str
代码的本意:
将值是NULL的str调整,变为100字节的内存空间后,在进行拷贝,最后打印出字符串。
结果:程序崩溃
疑点:
- 没有使用free进行释放申请的空间
- printf(str)是否写错?
解答:
传参的错误!在普通变量的传参中,若使用指针则是将变量的地址传递给指针后,这个变量的内容会因为地址的传递,而在调用函数中的改变而发生改变。
而在这里,指针变量str传递的只是数值,并不是地址,若要改变str的值,则只能传递str的地址,因为不是传递地址的形式进行传参,这个参数会自己单独开辟一个空间进行调用函数内部的代码运行。
改代码就是如此。
而printf(str)其实是正确的打印方式,在打印的字符串的形式中有一种特殊的写法就是如此。
因为字符串在打印的过程中,其实是将字符串的收个字符的地址传递给了printf进行打印,所以当str是一个指针,且这个指针的值是一个字符串,那么这个指针实际指向的是字符串的首字符。
以上两种写法是一样的,都是正确的!
正确的代码演示:
void GetMemory(char **p)
{
*p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}