和黛玉学编程..........>
这篇的代码对应知识点就在上一篇啦
常见的动态内存的错误
对NULL指针的解引用操作
void test()
{
int *p = (int *)malloc(INT_MAX/4);
*p = 20;
free(p);
}
如果P的值是空指针就会有问题,所以一般都会先进行判断
对动态开辟空间的越界访问
void test()
{
int i = 0;
int *p = (int *)malloc(10*sizeof(int));
if(NULL == p)
{
exit(EXIT_FAILURE);
}
for(i=0; i<=10; i++)
{
*(p+i) = i;
}
free(p);
}
当i是10的时候就会越界访问
对非动态开辟内存使用free释放
void test()
{
int a = 10;
int *p = &a;
free(p);
}
之前我们已经说过 free函数的时候,是对动态内存使用,所以这个就是错误的
使用free释放⼀块动态开辟内存的一部分
void test()
{
int *p = (int *)malloc(100);
p++;
free(p);
free使用的时候,指向的位置必须是对应的首地址,这里P已经变化了,所以是不行的哦
对同⼀块动态内存多次释放、
void test()
{
int *p = (int *)malloc(100);
free(p);
free(p);
}
动态开辟内存忘记释放(内存泄漏)
void test()
{
int *p = (int *)malloc(100);
if(NULL != p)
{
*p = 20;
}
}
int main()
{
test();
while(1);
}
这里就是忘记使用了free
动态内存经典笔试题
1.
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
我们来看结果
为什么呢?
这个就涉及到了函数栈祯的销毁,对于
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
下面的str根本没有影响,还是空指针,这个只是形参实参区别而已,它执行了这个代码以后就没有以后了
2、
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
我们看结果
我们return p以后,str就是首元素地址,但是GetMemory里面的数组在出来以后就不能使用了
你就算传首元素地址也没有用,你使用不了 ,
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
使用完以后P就是野指针了
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);
printf(str);
free(str);
}
这个就是正常打印hello啦
QWQ,希望对你有帮助!