关于动态内存分配的笔试题(二)

文章分析了四段C语言程序,涉及非法内存访问、野指针、内存泄漏等问题,强调了正确管理内存和避免未初始化指针的重要性。
摘要由CSDN通过智能技术生成

阅读如下几段程序,指出哪几段程序有问题,并说明有什么问题??

a)

int* f1(void)
{
  int x=10;
  return (&x);
}

问题:非法访问内存

分析:变量x属于栈区,当f1函数调用结束时,栈区的内存会自动还给操作系统,所以x的那块地址已经是未知的,所以再将其地址作为函数的返回值就会存在非法访问内存的问题

b)

int* f2(void)
{
  int* ptr;
  *ptr=10;
  return ptr;
}

问题:非法访问内存(野指针问题)

分析:定义指针时没有给指针初始化,又紧接着给指针赋值,这会出现非法访问内存问题

c)

#include<stdio.h>
#include<string.h>
void GetMemory(char** p,int num)
{
  *p=(char*)malloc(num);
}
void Test(void)
{
  char* str=NULL;
  GetMemory(&str,100);
  strcpy(str,"hello");
  printf(str);
}
int main()
{
  Test();
  return 0;
}

问题:内存泄漏

分析:忘记释放动态开辟的内存,导致内存泄漏。所以在打印完之后 free(str);str=NULL;

d)

#include<stdio.h>
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;
}

问题:程序输出world,但非法访问内存(篡改动态内存区的内容)

分析:使用了一块已经被释放的内存str,这就是非法访问内存。并且free释放str指向的空间后,并不会把str置为NULL,所以if判断没有意义。所以当释放str之后应该将str置为空

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写不出bug的小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值