C语言的哪些函数会导致内存溢出?如何改进?

描述

看一道大华的面试题,题目并不难。

问strcat strncat strcmp strcpy哪些函数会导致内存溢出?如何改进?

这几个函数,要说跟内存溢出没有关系的,只有strcmp。

它的功能只是比较两个字符串是否相等,给定地址,然后从地址开始逐个向后比较,并不涉及写内存,所以也不存在溢出的说法。

剩下的三个函数都有可能导致内存溢出。

就拿strcpy来说,作用就是把源字符串拷贝到目的内存中,实现的方法就是循环逐个赋值,如果源字符串过长,strcpy也不好把控,这样就会导致一些未知的情况发生。

那么有人可能会问,strcpy里面为什么不做个判断,如果目的内存不够,就停止赋值。

我们来看下strcpy的参数。

char *strcpy(char *dest, const char *src);

只有两个地址,在C语言中,只给你一个地址,是不好知道从这个地址开始,向后多少个字节是能用的。

于是在某些平台上,就出现了strcpy_s这样的函数。

strcpy_s(char *dest, int size, const char *src);

功能和strcpy差不多,就是多了个参数,第二个参数表示目的内存的大小,这样在拷贝的时候,就能精确的判断出内存是否越界。

内存溢出

当然了,如果你传参的时候瞎写了一个长度,这就不是函数的问题了,是你的问题。

strcat也是用样的问题,把一个字符串接在另一个字符串的后面,这个过程也没有考虑内存越界的问题。

strncat虽然可以指定连接的字符个数,但是函数内部在使用内存的时候,也没有做内存越界的判断,越不越界只能靠用户自己把握。




审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分