C语言笔记——动态内存函数5

83 阅读1分钟

​​​一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情。​

 程序崩溃

1.运行代码程序会出现崩溃的现象

2.程序存在内存泄漏的问题

str以值传递的形式给p,p是GetMemory函数的形参,只在函数内部有效,等GetMemory函数返回以后,动态开辟内存尚未释放,并且无法找到,所以会造成内存泄漏

改正:

改法1:

利用二级指针

void GetMemory(char**p)
{
	*p = (char*)malloc(100);
}

void Test(void)
{
	char* str = NULL;
	GetMemory(&str);
	strcpy(str, "hello world");
	prinf(str);
	free(str);
	str = NULL;
}

int main()
{
	Test();
	return 0;
}

改法2:

利用返回值的方式

char* GetMemory(char* p)
{
	p = (char*)malloc(100);
	return p;
}

void Test(void)
{
	char* str = NULL;
	str = GetMemory(&str);
	strcpy(str, "hello world");
	prinf(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);
}

int main()
{
	Test();
	return 0;
}

返回栈空间的地址的问题(非法访问内存的问题)

p创建的空间在离开函数GetMemory的时候已经将这块空间还给操作系统

相似的例子:

int* test()
{
	int a = 10;//栈区
	return &a;
}
int main()
{
	int *p = test();
    *p = 20;
	return 0;
}

同为返回栈空间的地址的问题

改正:

加长a的生命周期,把a放在静态区——static

int* test()
{
	static int a = 10;//栈区
	return &a;
}
int main()
{
	test();
	return 0;
}

举例: 

int* test()
{
	int* ptr = malloc(100);//堆区
	return ptr;
}
int main()
{
	int* p = test();
	return 0;
}

堆空间的空间只有free可以回收

3.请问运行Test函数会有什么样的结果?

int* test()
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");
	free(str);
	if(str!=NULL)
	{
		strcpy(str, "world");
		printf(str);
	}
}

Answer:会篡改动态内存区的内容。 因为free(str)之后,str成为野指针,if(str!=NULL)语句不起作用

改正:

int* test()
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");
	free(str);
	str = NULL;
	if(str!=NULL)
	{
		strcpy(str, "world");
		printf(str);
	}
}

​ ​