目录
- 1.第一题
- 1.1如何修改
- 2.第二题
- 2.1题想
- 2.2深刻理解
- 3.第三题
- 4.第四题
1.第一题
void GetMemory(char* p)
{
p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运⾏Test 函数会有什么样的结果?
我们来分析一下这个程序:
首先我们创建一个指针变量str,指向NULL,将其做参数传给函数GetMemory,进入函数;
我们在函数中申请100字节的空间,首地址给形参p,结束函数的调用;
出函数后,我们销毁了形参p;
但是str还是指向NULL,strcpy函数必会对str进行解引用,不能对空指针进行解引用,所以会崩溃;
1.1如何修改
这里我们可以有两种修改方法;
第一种:
str传进这个函数的方式是传值调用,并不会影响到str的值,所以我们可以传进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;
}
运行结果:
第二种:
我们也可以将修改后的指针返回出函数:
char* GetMemory(char* p)
{
p = (char*)malloc(100);
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory(str);
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
运行结果:
2.第二题
char* GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
请问运⾏Test 函数会有什么样的结果?
我们先来分析一下这个函数:
这题其实不难,等GetmMemory函数返回后,使用str指针去访问p数组,就是非法访问,因为p数组的内存已经还给了操作系统,所以,str是野指针;
运行出来结果并不是我们所想的hello world:
2.1题想
我们通过此题,我们发现,函数是不能返回栈空间的地址;
2.2深刻理解
但是有人可能会甩出这样的代码:
int* test()
{
int n = 10;
return &n;
}
int main()
{
int* p = test();
printf("%d\n", *p);
}
运行结果:
这不也是打印出结果了吗?
这里偶然的成功并不是长久之计;因为这里p指向的内存并没有被覆盖,所以我们可以打印出,如果我们在打印前加上一个其他的打印:
int* test()
{
int n = 10;
return &n;
}
int main()
{
int* p = test();
printf("hehe\n");
printf("%d\n", *p);
}
那运行结果就大差人意了:
到这你一定对这题有了更深刻的理解了;
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);
}
请问运⾏Test 函数会有什么样的结果?
这个代码有点像第一题的优化方案,但是有没有什么问题呢?
其实这个代码已经很完善了,但是没有free,所以我们应该这样改:
void GetMemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
free(str);
str = NULL;
}
所以各位在申请空间后一定要记得归还,不然可能会出问题;
4.第四题
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
请问运⾏Test 函数会有什么样的结果?
这题其实是考察我们free函数是否可以将指针置空,我们前面在讲动态内存管理的时候我们就知道了,free函数并不会给指针置空;所以也会打印出world:
此题告诉我们free函数并不会置空,所以我们应当添上;