C语言——动态内存管理(经典例题)

题1、

 C语言——动态内存管理(经典例题)_第1张图片

为什么会崩溃呢?

C语言——动态内存管理(经典例题)_第2张图片

#include 
#include 
#include 

void GetMemory(char** p)
{
	*p = (char*)malloc(100);
}
void Test(void)
{
	char* str = NULL;
	GetMemory(&str);
	strcpy(str, "hello world");
	printf(str);//ok

	free(str);
	str = NULL;
}

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

我们可以用二级指针来进行接收,这样在malloc的时候*p找到的就是str的地址,然后malloc申请的空间就是str所指向的了,这样就不会发生解引用NULL的操作了。 

#include 
#include 
#include 

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

void Test(void)
{
	char* str = NULL;
	str = GetMemory();
	strcpy(str, "hello world");
	printf(str);//ok

	free(str);
	str = NULL;
}

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

或者我们可以将p作为返回值返回,并将其赋值给str,这样也可以解决这个问题。 

 题2、

#include 
#include 
#include 
char* GetMemory(void)
{
	char p[] = "hello world";
	return p;
}

void Test(void)
{
	char* str = NULL;
	str = GetMemory();
	printf(str);
}

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

 C语言——动态内存管理(经典例题)_第3张图片

这个没办法正常输出的原因是什么呢?

C语言——动态内存管理(经典例题)_第4张图片

题3、

#include 
#include 
#include 
int* test()
{
	int a = 10;
	return &a;
}

int main()
{
	int* p = test();
	printf("haha\n");
	printf("%d\n", *p);

	return 0;
}

C语言——动态内存管理(经典例题)_第5张图片

 在这个代码里,a只是一个局部变量,在函数里定义了a之后,我们取地址将a的地址返回,a的这块空间,实际上已经被销毁了,所以我们在打印的时候,再去这块地址所指向的空间里找的时候,a就已经被销毁了。

 题4、

#include 
#include 
#include 
void Test(void)
{
	char* str = (char*)malloc(100);

	strcpy(str, "hello");
	free(str);

	if (str != NULL)
	{
		strcpy(str, "world");
		printf(str);
	}
}

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

C语言——动态内存管理(经典例题)_第6张图片

C语言——动态内存管理(经典例题)_第7张图片

要修改这个错误我们只需要在free过后,及时的将其置空。

你可能感兴趣的:(c语言,基础能力)