网站建设经费保障,如何申请百度竞价排名,网站备案级别,网站上传根目录文章目录 前言练习1#xff1a;练习2#xff1a;练习3#xff1a;练习4#xff1a; 前言
学习完C语言中的动态内存管理#xff0c;大家开始利用动态内存管理来去开辟空间#xff0c;经过一顿狂敲代码后#xff0c;发现了问题#xff0c;程序要么崩掉#xff0c;要么运… 文章目录 前言练习1练习2练习3练习4 前言
学习完C语言中的动态内存管理大家开始利用动态内存管理来去开辟空间经过一顿狂敲代码后发现了问题程序要么崩掉要么运行不起来。小编现在给大家分享动态内存中常见的练习如有谬误欢迎指正 练习1
void GetMemory(char* p)
{p (char*)malloc(100);
}
void Test(void)
{char* str NULL;GetMemory(str);strcpy(str, hello world);printf(str);
}运⾏Test 函数会有什么样的结果
敲完代码运行一下程序崩掉啦。这里的GetMemory函数采用的是值传递形参是实参的一份临时拷贝。p和str是各自独立的两个指针GetMemory)函数让p开辟了一个内存空间。但是重点p的值最初是在str中拷贝的拷贝完之后两个指针没有任何关系。当GetMemory函数结束后p的内存就被释放掉了然后执行srecpy此时str仍然是一个空指针这个程序也就无法被访问。
还有一个问题是GetMemory中申请的内存空间没有被释放掉存在内存泄漏问题。 改进后的代码 void GetMemory(char** p)//形参用二级指针接收此时p里面存的是str的地址
{*p (char*)malloc(100);//*p得到str让str指向新开辟的空间
}
void Test(void)
{char* str NULL;GetMemory(str);//址传递strcpy(str, hello world);printf(str);free(str);str NULL;
}int main()
{Test();return 0;
}运行结果 hello world这个问题在日后会经常遇到需要留意一下。
练习2
char* GetMemory(void)
{char p[] hello world;return p;
}
void Test(void)
{char* str NULL;str GetMemory();printf(str);
}运⾏会有什么样的结果 数组p是一个局部变量
在 GetMemory 函数之后数组 p 的内存空间就被销毁了还给了操作系统虽然把这个数组首元素的地址返了回去但此时再通过地址去访问这一块空间就成了非法访问。 修改后的代码 char* GetMemory(void)
{char* p hello world;return p;
}
void Test(void)
{char* str NULL;str GetMemory();printf(str);
}int main()
{Test();return 0;
} 运行结果 hello world练习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);
}运行结果 hello world这段代码运行后发现是可以的但是看到了malloc却看不到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;
}int main()
{Test();return 0;
}练习4
void Test(void)
{
char *str (char *) malloc(100);
strcpy(str, hello);
free(str);
if(str ! NULL)
{
strcpy(str, world);
printf(str);
}
}运⾏会有什么样的结果
world代码也是可以运行的
但是依然有错
因为早在开始就把str给释放了这块内存权限给了操作系统
在 free 完后没有把 str 置为空所以 str 还是指向那块空间此时的 str 已经变成了一个野指针后面一些列涉及 str 的操作都属于非法访问。 修改后的代码 void Test(void)
{char* str (char*)malloc(100);strcpy(str, hello);free(str);str NULL;if (str ! NULL){strcpy(str, world);printf(str);}
}