这道笔试题竟然运行不出错

#读者提供的面试题

下面这张截图是一个读者在面试的时候遇到的题目,是哪个公司的我就不说出来了,我在微信朋友圈发了这个题目后,有几个好友给我留言说自己也写了这道题。

题目:下面这段代码有什么问题?

#后续

然后我就用这个图片发了朋友圈,很多人也回复了,天资跟我差不多的人呢,都看出来了就是 if 判断的代码需要往上移动下,要不然呢,malloc 后没有释放,就会出现内存泄漏。

这个是基本的,还有一些后续的回复,有几个微信好友回复还是比较不错,在这里分享给大家。

#我写的测试源码

#include "stdio.h"
#include "stdlib.h"
#include "string.h"int swap(void *a,void* b,int size)
{void *p;p = malloc(size);if(size <= 0){printf("error");return -1;}memcpy(p,a,size);memcpy(a,b,size);memcpy(b,p,size);free(p);return 0;
} int main()
{char *a = "12344";char *b = "adbde";swap(a,b,5);printf("a:%s\tb:%s\n",a,b);return 0;
}

程序输出

a:adbde b:12344--------------------------------
Process exited after 0.03298 seconds with return value 0
请按任意键继续. . .

#void* 指针

程序里面有一个 void 指针,这个需要注意下,void指针是可以接收所有类型的指针的,但是其他类型的指针是不能直接接收void指针的。

比如这样

#include "stdio.h"int main()
{ void *p = NULL;char *p1 = NULL;p = p1;return 0;
}

下面这样可能是有问题的

我说是可能有问题是因为GCC、ANSI C 的编译情况是不同的。

#include "stdio.h"int main()
{ void *p = NULL;char *p1 = NULL;p1 = p;return 0;
}

#程序有什么问题?

这段代码有以下几点问题:

1、入参ab都是void类型的指针,不清楚ab指向buff的长度是否都为size?size不要设置成int,最好设置成unsigned int, 而且ab入参一定不能代入const xxxxx *类型的实参;

2、 进入函数体之后应该首先判断size是否小于等于0ab是否为NULL,如果size小于等于0,或者ab存在NULL,那其他代码将毫无意义。

3、没有if(!p)malloc进行判断直接使用p,剩余内存较低情况下malloc一片大内存是有可能fail的,直接使用p就会段错,而且不建议malloc

4、memcpy时因并不明确a b指针指向buff的长度是否都为size,存在内存越界风险。

综上述修改代码为:

int swap(void *a, void *b, uint32_t len_a, uint32_t len_b)
{if ( !a || !b || !len_a || !len_b || len_a!=len_b ) {printf("invalid param! \n");return -1;}if ( a==b ) {printf("the same! \n");return 0;}uint32_t len = len_a;char *p = (char *)malloc(len);if (!p) {printf("malloc fail! \n");return -1;}memcpy(p,a,len);memcpy(a,b,len);memcpy(b,p,len);free(p);return 0;
}

#参考代码

//我写了一个swap:
//感谢读者LinuxEnginetypedef struct {char byte[4];
} stdb_4;
typedef struct {char byte[8];
} stdb_8;void my_swap(void *p, void *q, size_t p_sz, size_t q_sz)
{char buff[256];if ( !p || !q ||!p_sz || !q_sz || p_sz != q_sz || p==q )return;int sz = p_sz;if ( sz == 4 ) {stdb_4 t  = *(stdb_4 *)p;*(stdb_4 *)p  = *(stdb_4 *)q;*(stdb_4 *)q  = t;return;} else if ( sz == 8 ) {stdb_8 t  = *(stdb_8 *)p;*(stdb_8 *)p  = *(stdb_8 *)q;*(stdb_8 *)q  = t;return;}while ( sz > sizeof(buff) ) {my_swap (p, q, sizeof(buff));p = (char *)p + sizeof(buff);q = (char *)q + sizeof(buff);sz -= sizeof(buff);}memcpy(buff, p,    sz);memcpy(p,    q,    sz);memcpy(q,    buff, sz);
}

#后续

感谢读者LinuxEngine给出的答案以及示例代码,大家如果看到有优化的地方,可以在评论区说出你的答案,写程序是一个非常严谨的事情,程序写得严谨了,该考虑到的问题都能想到了,大概率就能去除一些比较明显的bug。

祝大家周末愉快!

  #推荐阅读:

    专辑|Linux文章汇总

    专辑|程序人生

    专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android加号底部导航栏,EasyNavigation Android 底部导航栏████几行代码实现 Tab 导航(随意定制加号,带红点消息提示) @codeKK Android开源站...

几行代码轻松实现底部导航栏(Tab 文字图片高度随意更改)&#xff1b;中间可添加加号按钮&#xff0c;也可添加文字&#xff1b;(足够的属性满足你需要实现的加号样式)如果还不能满足、中间可添加自定义 View&#xff1b;Tab 中随意添加小红点提示、数字消息提示&#xff1b;点击…

ASP.NET 2.0新特性视频教程下载

这里是下载页面 这是Framework 2.0下面新特性的系统视频讲座,英文的,说话讲得很清楚音质不错,英文好的朋友有福了.包含以下这些主题: 数据访问 MasterPage与站点导航 成员与角色 用户配置文件与主题 Web Part与个性化 输出缓存与SQL数据库缓存 部分页面缓存 本地化 向导控件与页…

在工厂的这几天

上周在工厂呆了6天支持我们产品量产&#xff0c;说下自己在工厂看到的一些事情&#xff0c;可能对大家对嵌入式行业有一定的认识&#xff0c;这样大家在选择方向会有些借鉴作用。产品由研发到生产是一个过程&#xff0c;只有经受过量产考验的产品&#xff0c;才能说这个产品真正…

android 4.4 下拉菜单 透明,4.2状态栏,下拉,全局透明教程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼三、CM10全局透明教程步骤&#xff1a;1、反编译framework-res.apk&#xff0c;用文本编辑器打开res\values\styles.xml&#xff0c;这里说明一下&#xff0c;styles.xml就是主框架下的布局主题文件。用Notepad文本软件打开styles.…

ASP.NET中Cookie编程的基础知识

一、简介 Cookie 为 Web 应用程序保存用户相关信息提供了一种有用的方法。例如&#xff0c;当用户访问您的站点时&#xff0c;您可以利用 Cookie 保存用户首选项或其他信息&#xff0c;这样&#xff0c;当用户下次再访问您的站点时&#xff0c;应用程序就可以检索以前保存的信…

Arm华为NXP睿赛德大咖云集!2020中国嵌入式技术大会嘉宾揭晓

展会即将开幕▲扫码领门票从电子信息产业趋势看&#xff0c;以自动驾驶、智能机器人和智慧安防为代表的AIOT&#xff08;智联网&#xff09;正在成为新一轮科技创新制高点。5G 布置将大大提升端侧智能&#xff0c;助力AIOT 发展。从技术层面看&#xff0c;AIOT 是AI 技术嵌入到…

c语言变量加常量,C语言(二)---常量与变量(示例代码)

一、进制1.1 二进制1.1 简介二进制数据是用0和1两个数码来表示的数。它的基数是2&#xff0c;进位规则是“逢二进1”&#xff0c;借位规则是“借一当二”。当前的计算机系统使用的基本上是二进制系统。1.2 二进制数据表示法二进制没有2只有0和1&#xff0c;逢2进1&#xff0c;其…

使用CodeSmith要注意的几点

新的项目即将开始了&#xff0c;项目经理老蔡说上次项目的持久层框架不太适合B/S项目&#xff0c;原因是反射用得太多了&#xff0c;并且数据层内部自己又封装了好几层&#xff0c;所以决定从新设计一个执行效率更高的框架。 老蔡设计了下他构思好的持久层和数据层的接口&am…

Alsa里面恶心的DAPM

相关文章音频系统&#xff0c;Alsa 里面的buff 是怎么计算的&#xff1f;为什么需要超过48k的采样音频&#xff1f;我在MTK平台下调试音频ALSA音频几个重要的参数openwrt 音频开发(干货)Ai音箱和Linux音频驱动小谈Android 音频数据流分析之程序员干架产品经理正文做音频的很多初…

android 屏幕关闭 eofexception,android EOFException异常解决办法 (SharedPreferences保存对象)...

SharePreferences可以保存String 但是不能保存对象这不符合面向对象。为此可以通过序列化和反序列化将Serializable对象和字符串相互转化所以可以将Serizlizable对象转化为字符串保存到SharedPreferences中SharedPreferences.Editor localEditor settings.edit();localEditor.…

软件开发能力成熟度模型CMM介绍

软件开发能力的成熟度模型(Capability Manurity Model for Software&#xff0c;CMM)是软件工程协会SEI(Software Engineering Institution)在卡内基.梅隆大学开发完成的对一个组织软件开发能力进行评价的标准&#xff0c;它侧重于对软件开发过程和开发方法论的考察。CMM包括五…

POJ 3461Oulipo KMP模板

KMP之所以线性,因为匹配的时候i是不往回走的 我们只用调整j的位置 假设在s中找t 用二元组(i,j)表示s串的[i-j1,i] 与t串的[1,j]匹配 假设s[i1]和t[j]匹配上了,就j 如果不匹配的话,我们就想办法调整j, 直到找到一个满足二元组条件的j并且t[j1]s[i] 快速调整j就是利用nxt数组的过…

从Linus Torvalds一封发飙的电邮开始谈设备树究竟是棵什么树?

[导读] 新版的U-Boot以及内核都引入了设备树&#xff0c;那么这究竟是棵什么样的树呢&#xff1f;长啥样&#xff1f;有啥用&#xff1f;为啥弄个这样的树&#xff1f;本文基于对设备树标准的理解&#xff0c;来学习整理一下相关的要点&#xff0c;供大家参考。Linux为啥要设备…

html两个div间有白线,html-在特定浏览器宽度下,白线出现在渐变填充div的末尾

我有一个ID为#gradient_div的div,其背景图像设置为线性渐变.仅在某些浏览器窗口宽度下,线性渐变的末尾与div #gradient_div的末尾之间才出现缝隙.当我拉伸和收缩浏览器窗口时,这条白线消失并重新出现.似乎与边距有关&#xff1a;>当我将边距设置为margin&#xff1a;0 1&…

递归多线程实现前缀和

http://blog.csdn.net/qq_21361539/article/details/51577263转载于:https://www.cnblogs.com/NEU-2015/p/7857668.html

[Classic] 日文版《出师表》

臣亮言す.先帝业を创めて未だ半ばならずして,中道にして崩祖せり.今天下三分すれども, 益州は疲弊す.此れ诚に危急存亡の秋なり.然れども侍卫の臣,内に懈らず,忠志の士,身を 外に忘るるは,盖し先帝の殊遇を追いて,之を陛下に报いんと欲すればなり.诚に宜しく圣聴 を开张して…

为什么读书了,还不如那些初中毕业的同学

今天群里特别热闹&#xff0c;大家聊了很多&#xff0c;我在旁边看着&#xff0c;很舒服&#xff0c;可能也有人跟我一样&#xff0c;看着这些B神吹牛。像读书时候的卧谈会&#xff0c;大家都聊的很嗨&#xff0c;听的人更嗨&#xff0c;我就是那个喜欢听大家吹牛的人&#xff…

html判断整数小数点后两位小数点,js控制input框只能输入数字和一位小数点且小数点后面只有两位小数...

js控制input框只能输入数字和一位小数点且小数点后面只有两位小数js控制input框只能输入数字和一位小数点且小数点后面只有两位小数212或 0.66; 过滤 00000,1.10,0.00function clearNoNum(obj){obj.value obj.value.replace(/[^\d.]/g,""); //清除“数字”和“.”以…

为什么说卷积神经网络,是深度学习算法应用最成功的领域之一?

目前&#xff0c;作为深度学习的代表算法之一&#xff0c;卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;在计算机视觉、分类等领域上&#xff0c;都取得了当前最好的效果。后来&#xff0c;基于深度神经网络和搜索树的智能机器人“AlphaG…

C语言博客作业--函数

C语言博客作业--函数 一&#xff0c;PTA实验作业 6-2 简单实现x的n次方 1.本题PTA提交列表 2.设计思路 double mypow( double x, int n )函数&#xff08;1&#xff09;定义y1&#xff0c;i用于循环变量&#xff08;2&#xff09;for(i1;i<n;i){ yy*x}用循环实现x的n次方&am…