1.代码1
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中调用了GetMemory函数,了解到我们的目的是想将hello word 拷贝到calloc开辟的空间里面,然后在终端打印出来,我们一看代码好像没什么问题,那我们来运行一下,看看能不能达到我们想要的效果。
运行结果:
没有任何结果,这是为什么呢?因为在GetMemory中申请的空间是局部变量,出函数就会被销毁。所以我们拷贝不过来,运行结果也为空。
2.代码2
char* GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
那这串代码的运行结果又是什么呢?我们来看看:
为什么是一串乱码呢?在这里问题也是出在GetMemry上,创建的数组p在出函数后就被销毁了,str接收了GetMemory的返回值,但这个指针是没有指向任何空间的,所以在打印时就是一些乱码。在这里我们可以将p数组改为静态的(让其出函数不会被销毁),即可。演示如下:
我们使用static将其变为静态数组,只有在程序结束后才会被销毁。
3.代码3
void GetMemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
int main()
{
Test();
return 0;
}
这个代码运用了二级指针的知识,那么大家思考一下这个能完成我们的目的吗?
结果为:
这是为什么呢?大家可以先思考思考,下一期会解释。嘿嘿
4. 代码4
void Test(void)
{
char* str = (char*)malloc(100);
assert(str);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
代码的运行结果为:
有人就会想我们已经将str所指向的空间给释放了,怎么还是可以打印出来。在释放了为str指针分配的内存后,仍然在if语句中访问它。这是未定义的行为。能打印出来不代表是对的,也许只是碰巧我们申请的空间没有被覆盖。