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

本文探讨了在不同编译环境下malloc(0)的行为差异,揭示了面试题中存在的潜在问题,并强调了正确使用malloc及释放内存的重要性。

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

       言归正传,今天讨论的面试题是一个嵌入式程序员常见的问题,在嵌入式系统中需要从堆(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

CRME多商户PHP v4.1.0 PC更新说明文档 1. 年/次卡商品 商家可自由创建时效卡(年卡、季卡、月卡等)、次数卡,灵活定价并配置服务内容,完美适配美业、健身、培训等不同业态需求,彻底解决传统线下卡项登记繁琐、余量模糊、核销不便等问题。 2. 店铺限制商品分类、商品类型 平台可以指定商家可使用的商品分类和商品类型; 商户/店铺入驻申请时,申请表单增加“平台商品分类选择(数量限制可配置)、商品类型选择”等字段,商户自由选择经营类目,平台严格把关。 3. 营销功能适配到店/同城配送 预售、秒杀、拼团、助力四大主流营销活动均支持“到店自提”与“同城配送”,适配本地生活零售场景,增强用户消费灵活性,提升商家获客与转化效率。 4. 系统优化 1. 平台、商户、店铺、代理商各自的后台登录界面分开 2. 平台余额充值增加退款操作,后台增加退款功能 3. 商品标签增加开始时间和结束时间 4. 管理端视频列表加载优化 5. 上传视频接口修改为:上传视频和封面图两个参数 6. 修改素材表增加封面图字段 7. 代理商后台数据权限控制,增加代理邀请店铺入驻专属链接 8. 领券中心的券根据消费者进入的商圈进行展示并领取 9. 移动端根据用户定位自动进入商圈 10. 预约商品到店服务支持按照自提点进行下单 11. 平台商品参数模版支持设置此类商品必须添加或者选填 12. PC商城增加扫码登录功能 13. 大图推荐可以批量设置,大图带有视频的商品在浏览时自动播放 14. 店铺二维码中LOGO使用商家LOGO 15. 代客下单搜索用户,手机号需要全量搜索 16. 所有活动列表,只展示正在进行中的活动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值