动态内存管理经典笔试题目

  • 题目1

void GetMemory(char *p)
{
    p = (char *)malloc(100);
}
void Test(void)
{
    char *str = NULL;
    GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
}

程序崩溃,原因如下:

1、形参p是实参str的一份临时拷贝,对p进行的操作不影响str的值,str仍为NULL,在进行strcpy的过程中,对NULL进行解引用操作,程序崩溃

2、形参p记录了开辟的内存空间起始地址, GetMemory函数调用结束后p销毁,因此申请的内存空间的起始地址不知道了,这个过程造成了内存泄漏。

修改后的程序为:

void GetMemory(char** p)
{
    *p = (char*)malloc(100);
}
void test(void)
{
    char* str = NULL;
    GetMemory(&str);
    strcpy(str, "hello world");
    printf(str);
    free(str);
    str = NULL;
}

结果为

  •  题目2

char *GetMemory(void)
{
    char p[] = "hello world";
    return p;
}
void Test(void)
{
    char*str = NULL;
    str = GetMemory();
    printf(str);
}

程序结果为:

 原因为GetMemory函数运行过程中产生的临时数组,数组的首元素地址传回,指针str进行接收,但是GetMemory函数调用完,临时数组被销毁,这块内存新内容不可知,str访问这块内存产生如上的结果,str成为野指针。

  • 题目三

void GetMemory( char **p, int num )
{
 *p = (char *) malloc( num );
}
 
void Test( void )
{
 char *str = NULL;
 GetMemory( &str, 100 );
 strcpy( str, "hello" ); 
 printf( str ); 
}

 程序结果为

 这个程序存在的错误为内存忘记释放 

 修改后为:

void GetMemory(char** p, int num)
{
    *p = (char*)malloc(num);
}

void Test(void)
{
    char* str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf(str);
    free(str);//修改部分
    str = NULL;
}
  • 题目四

void Test(void)
{  
  char *str = (char *) malloc(100);
  strcpy(str, "hello");
  free(str);
  if(str != NULL)
  {
     strcpy(str, "world");
     printf(str);
  }
}

运行结果为:

 这个程序错误的原因是str成为野指针,没有置空。内存释放后,str对这块内存就没有使用权限了,但str仍旧记得这块空间的地址,所以对这块空间进行了非法访问和修改,将"hello"非法修改为"world"。这个程序修改方法为free后加str=NULL;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSDN嵌入式笔试面试题系列是CSDN提供的面向嵌入式系统工程师的一系列笔试题,旨在评估面试者在嵌入式领域的知识和技能。 这些面试题涵盖了嵌入式系统的各个方面,包括硬件设计、嵌入式软件开发、嵌入式操作系统等。通过回答这些题,面试者可以展示他们的专业知识、问题解决能力和团队协作能力。 作为一个嵌入式系统工程师,我会通过以下几个方面来回答这一系列的面试题: 1. 硬件设计:我会解释如何设计一个嵌入式系统的硬件架构,包括选择核心处理器、外设接口的设计和电路设计等。 2. 嵌入式软件开发:我会谈谈自己的嵌入式软件开发经验,包括使用哪些开发工具和编程语言,如何进行软件调试和优化。 3. 嵌入式操作系统:我会介绍我在嵌入式操作系统方面的经验和知识,包括熟悉的操作系统类型,如RTOS和Linux,以及如何进行任务调度和内存管理等。 4. 项经验:我会分享我在嵌入式项中的经验,包括完成的项类型、任务分工和团队合作等。 5. 学习与发展:我会表达自己对嵌入式领域的学习态度和发展意愿,包括对新技术的关注和学习计划等。 综上所述,CSDN嵌入式笔试面试题系列是一系列用来评估嵌入式系统工程师技能的笔试题。通过回答这些题,面试者可以展示他们的专业知识和技能,并展示自己在嵌入式领域的学习态度和发展潜力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值