看一道大华的面试题,题目并不难。
问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虽然可以指定连接的字符个数,但是函数内部在使用内存的时候,也没有做内存越界的判断,越不越界只能靠用户自己把握。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !