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

 


相关文章
|
6月前
|
C语言
关于动态内存管理中的常见练习题
关于动态内存管理中的常见练习题
46 0
|
3天前
|
程序员 编译器 C语言
C语言:动态内存(一篇拿捏动态内存!)
C语言:动态内存(一篇拿捏动态内存!)
98 2
|
9月前
“野指针”和大厂经典的动态内存错误笔试题
“野指针”和大厂经典的动态内存错误笔试题
|
10月前
练习——动态内存分配的笔试题
练习——动态内存分配的笔试题
|
3天前
|
存储 程序员 编译器
动态内存管理+柔性数组+经典笔试题
动态内存管理+柔性数组+经典笔试题
46 0
|
5月前
|
C语言
C语言动态内存管理(二)经典笔试题
C语言动态内存管理(二)经典笔试题
60 0
|
6月前
|
程序员 C语言 C++
动态内存管理之经典笔试题
动态内存管理之经典笔试题
59 0
|
6月前
动态内存经典笔试题详解!!!
动态内存经典笔试题详解!!!
|
8月前
|
存储 编译器 C语言
【C++初阶】动态内存管理
【C++初阶】动态内存管理
102 0
【经典笔试题】动态内存管理
test1:请问执行上面代码,会出现什么结果? 解析:运行该段代码时,程序会崩溃 答案:调用Test函数时,在Test函数内部又调用Getmemory函数,即使在Getmemory函数内部申请空间,返回的该空间的起始地址给p,然而p并未返回,str仍为NULL。拷贝 &quot;hello world&quot;到str内部,将会导致程序崩溃。 改正:可以将p申请的空间返回。