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

68 阅读1分钟

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

1.如果p指向空间之后有足够的内存空间可以追加,则直接追加,后返回p

2.如果p指向空间之后没有足够的内存空间可以追加,则realloc函数会重新找一个新的内存区域,开辟一块满足需求的空间,并且把原来内存中的数据拷贝回来,释放旧的内存空间,最后返回先新开辟的内存地址

3.要用一个新的变量来接受realloc函数的的返回值

int* ptr = realloc(p, 40);
	if (ptr != NULL)
	{
		p = ptr;
	}

常见的动态内存的错误

1.对NULL指针的解引用操作

//错误示范
int main()
{
	int* p = (int*)malloc(40);
	//万一malloc失败,p就被赋值为NULL
    //*p = 0;//err
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;
	}
	free(p);
	p = NULL;

	return 0;
}

要对p进行相关的判断 

2.对动态开辟的内存的越界访问

int main()
{
	int* p = (int*)malloc(5 * sizeof(int));
	if (p == NULL)
	{
		return 0;
	}
	else
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			*(p = i) = i;
		}
	}
	free(p);
	p = NULL;

	return 0;
}

3.对非动态开辟内存的free

int main()
{
	int a = 10;
	int* p = &a;
	*p = 20;
	free(p);
	p = NULL;
	return 0;
}

4.使用free释放动态开辟内存的一部分

int main()
{
	int*p(int)malloc(40);
	if (p == NULL)
	{
		return 0;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*p++ = i;
	}
	//回收空间
	free(p);
	p = NULL;
	return 0;
}

5.对同一块动态内存的多次释放ruhe

int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		return 0;
	}
	//使用
	//释放
	free(p)
	//......
	free(p);

	return 0;
}

 如何避免:在free(p)后加上 p = NULL;

6.对动态开辟内存的空间忘记释放(内存泄漏)

while (1)
{
	malloc(1);
}
return0;

几道经典题目:

​​

1.这个程序出现了什么错误


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

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

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