GetMemory(&str);//传地址就没问题
strcpy(str,“hello world”);//此时str不再是NULL了,而是新申请的首元素地址
printf(str);//打印出hello world
free(str);
str=NULL;//说烂了,不说了,简称一套带走,嘻嘻!!
}
int main()
{
test();
}
改正2:(返回值接收)
//问:下面test函数会输出什么
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* GetMemory(char*p)
{
return p = (char*)malloc(100);
}
void test(void)
{
char*str = NULL;
str = GetMemory(str);//返回值接收
strcpy(str, “hello world”);
printf(str);
free(str);
str = NULL;
}
int main()
{
test();
}
注意:上面的解法中虽然p是局部变量,在栈区上开辟,出了函数,p指针销毁,但动态内存函数申请的空间在堆区,出了函数不会被销毁,且指针p在销毁是已将开辟好的地址传给了str,所以可行。
第二题:
========
#include<stdio.h>
#include<stdlib.h>
char* GetMemory(void)
{
char p[]=“hello world”;
return 0;
}
void Test(void)
{
char* str=NULL;
str=GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
原因分析:
1.由题目可知,p数组是在代码块之内创建的局部变量,是在栈区上的,p数组出了此函数
就会被销毁,返回不出任何东西,换言之就是str 接了个寂寞(手动狗头)。
2.虽然str还是指向数组首元素地址,但是那块地址已经不存在了。所以会报错。
如何改正呢?
最简单的方法就是将数组和指针在同一个函数中。
f****or example:
#include<stdio.h>
#include<stdlib.h>
void Test(void)
{
char p[]=“hello worl 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 d”;
char* str=NULL;
str=p;//数组名就是首元素地址str指向h
printf(str);
}
int main()
{
Test();
return 0;
}
这样是不是非常的easy
还有几个和上面那个类似的题
for example:
#include<stdlio.h>
int * test()
{
int a=10;
return &a;//返回a的地址
}
int main()
{
int *pp =test();
*pp=20;//将a赋值,成功?
return 0;
}
显然会报错,原因基本和上题类似
经过这两题我们应该明白了,最主要的原因就在于该值创建在栈区,且返回栈区上创建的值。
在这过程其实我们也明白了,栈区的值不能被返回。改进方法之一是让这个值不是局部变量,
变成全局变量,或者是**静态变量(其实就是在静态区或者堆区上创建)**就可以了。
**这里只讲个最简单的方法(**因为咱这里是讲动态内存的题,不能在继续水下去了)
直接在变量前加上static
#include<stdlio.h>
int *test()
{
static int a=10;
return &a;//返回a的地址
}
int main()
{
int *pp= test();
*pp=20;//将a赋值,成功?
return 0;
}
至于static的用法有小伙伴不知第道的可以私信我,或者后期出一期讲解
第三题:
====
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Test(void)
{
charstr=(char)malloc(100);
strcpy(str,“hello”);
free(str);
if(str!=NULL)
{
strcpy(str,“world”);
printf(str);
}
}
int main()
{
Test();
return 0;
}
**这题主要原因:**在于free函数提前释放所申请的空间,但是此时str还是指向原地址,导致strcpy进行对str的拷贝,出现了非法访问(相当于访问了一块不属于你的空间)。
解决方法:
**1.**可以是释放的同时将str指针置NULL,这样判断就不会成立也就不会出现后续非法访问。
2. 也可以是在使用完后释放再置空
第一种: