C++面试题(20)| strcpy存在什么问题

55 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

image.png

(欢迎大家关注我的微信公众号——控制工程研习,上面会分享很多我学习过程中总结的笔记。)

本题来自深信服C++面试

答案:

    strcpy无法知道目标缓冲区有多大(即没有长度参数),因此草率地使用它编程可能会导致缓冲区溢出并损坏其他内存。这种溢出可能导致崩溃和奇怪的行为,并可能被恶意软件作者利用。

    如果你知道缓冲区足够大(例如,你在上一行中以正确的大小分配了缓冲区),那么就可以使用 strcpy。如果有任何溢出的可能性,请使用strncpy并确保将缓冲区中的最后一个位置设置为null。

分析:  

    这实际上是一个C语言中的问题,但是在C++面试中也可能遇到。

函数用法:

        这是C语言里面复制字符串的库函数, 函数声明包括在专门处理字符串的头文件<string.h>中:

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

这个函数把字符串src复制到一分配好的字符串空间dst中,复制的时候包括标志字符串结尾的空字符一起复制。操作成功,返回dst,否则返回NULL.

问题验证:

    下面这种写法就可能出现问题,编译器一般就会报错(因为s数组的大小为5,而传递给他的字符串的长度为7了):

char s[5];
strcpy(s,"abcdefg");

编译的报错信息如下:

Run-Time Check Failure #2 - Stack around the variable 's' was corrupted.

这表示在变量s附近的内存被破坏了,如果出现此类问题,一般表示程序存在内存越界

strncpy()函数的用法:

    更推荐使用的函数是strncpy(),其语法形式为:

char *strncpy(char *dest, const char *src, int n)

这个函数表示把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest。