【原创】每周一题(080226)----面试题解析

       时间过的很快,转眼之间新年就这样过去了,这次在家呆的时间足够长了,足足半个月!想想在念大学的时候,早早的就回学校了。也没在家过十五,这次因为一些原因,在家呆到过完十五,爽……

       言归正传,今天讨论的面试题是一个嵌入式程序员常见的问题,在嵌入式系统中需要从堆(heap)中动态分配内存的过程的,那么嵌入式系统中,动态分配内存可能发生的问题有哪些呢?在网上看到有这么一道题:

#include "stdio.h"
#include "stdlib.h"

void main(void)
{
     char *ptr;
 
     if((ptr = (char *)malloc(0)) == NULL) {
         printf("Got a null pointer\r\n");
     } else {
         printf("Got a valid pointer\r\n");
     } 
}

问输出结果是什么?

这里考的就是有关内存分配的问题,大多数的嵌入式程序员都应该使用过malloc()这个函数,但是你有尝试过如果分配的内存空间是0的话,会是什么样的结果吗?请注意程序中,紫色部分代码!当时给我第一个感觉答案是Got a null pointer.因为之前我在移植LWIP的时候,看到作者自己写的一个类似与malloc函数,在那里当函数void *malloc(size_t size) 当size == 0 时 return NULL。所以我第一个感觉就是得到Got a null pointer。

当看到答案的时候却是:Got a valid pointer。这是为什么呢?

记得前段时间看过一本书《linux程序设计》(英文版)作者:(美)Arnold Robbins著 感觉这本书十分的好,对于linux编程人员来说,在这里你可以看到在中文资料上看不到的好东西!这个就不多说了,有兴趣的人自己去看看吧!在那本书里面也没有讲到有关malloc函数中size == 0 的时候,返回什么结果?

带着这个疑问,我先使用了debian linux操作系统,在下面写了这么一个程序,经过编译后得到的却是Got a valid pointer。也就是说内存分配成功了。

我很不甘心就这样罢休,接着我又使用了Borland c++ Version 3.1的编译器,经过bcc后,发现输出的结果是Got a null pointer。看上去似乎很有趣!

接着我又使用了KEIL C51的编译器V2.40A的版本编译,出现的结果也是Got a null pointer

随后我又使用了Visual Studio 2003编译后的结果和linux下的结果一致也能得到一个valid  pointer

经过不同的编译器,得到的结果却大大不同,这让我有些疑惑,最后还是求助于最早的TC2.0编译器吧。结果却是在我意料当中……>Got a null pointer

经过这几种编译器的比较,发现有些面试题出的十分的不严谨,而在网上看到那个人的话语,似乎得到Got a valid pointer这样的答案才是正确的,因为他仅仅使用了一种编译器,而他使用的这样编译器,不一定能出现标准的,正确的答案,具体还需要看malloc函数使用的是哪个版本,或其编译器在编译连接处理的时候是如何处理的,不同的编译器得到的却是不一样的结果,所以我觉得这样的面试题,也就只能考考一些没有经验的人士,若是真的考到了专业人士的话,我想出题目的人员,你是不是该深思一下,有些面试题不要一味的上网去下载,即使下载了,希望你们能找几道经典的题来考面试者,别拿出来让我议论纷纷的答案!这样对公司的一个整体印象会大打折扣的!

在这里,我还需要说明的是,我看过上面的面试题的时候,我感觉出这道题的人,是一个很没有水准的一个程序员,虽然他想考面试者有关malloc(0)的问题,但是最起码程序应该写的标准以及尽量完善一些吧?

我建议这么写

#include "stdio.h"
#include "stdlib.h"

void main(void)
{
     char *ptr = NULL;
 
     if((ptr = (char *)malloc(0)) == NULL) {
         printf("Got a null pointer\r\n");
     } else {
         printf("Got a valid pointer\r\n",len);
    } 
    free(ptr);
    ptr = NULL;
}

注意使用malloc的时候内存的回收和避免发生野指针的问题!需要大家注意!

声明:

       内容分析和结果表述,为个人意见,请参考使用!

       转载请注明著作(小盒子)和出处!谢谢!

       如果有任何错误,敬请指教,联系Email:Small.Box@163.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值