6个常见的动态内存的错误和动态内存经典笔试题

简介: 6个常见的动态内存的错误和动态内存经典笔试题

和黛玉学编程..........>


这篇的代码对应知识点就在上一篇啦

常见的动态内存的错误

对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,希望对你有帮助!

 


相关文章
|
12月前
|
程序员 编译器 C语言
一篇博客学会系列(3) —— 对动态内存管理的深度讲解以及经典笔试题的深度解析
一篇博客学会系列(3) —— 对动态内存管理的深度讲解以及经典笔试题的深度解析
115 0
|
29天前
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
45 1
|
29天前
|
程序员 编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(下)
动态内存分配与管理详解(附加笔试题分析)(下)
44 2
|
5月前
|
程序员 C语言 C++
【C语言基础】:动态内存管理(含经典笔试题分析)-2
【C语言基础】:动态内存管理(含经典笔试题分析)
|
5月前
|
程序员 编译器 C语言
【C语言基础】:动态内存管理(含经典笔试题分析)-1
【C语言基础】:动态内存管理(含经典笔试题分析)
|
5月前
|
程序员 C语言 C++
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
128 0
|
6月前
关于动态开辟内存的经典笔试题
关于动态开辟内存的经典笔试题
28 0
|
6月前
|
编译器 程序员 C语言
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(下)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
42 0
|
6月前
|
编译器 C语言 C++
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(中)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
50 0
|
6月前
|
存储 程序员 编译器
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(上)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
46 0