sprintf函数内存越界

发布时间 2023-10-25 23:50:07作者: zzKino

最近在做项目的时候遇到sprintf函数内存越界的问题,现在分享给大家,希望对大家有用。

首先介绍了sprintf 这个函数。

函数原型:  int sprintf(char *str, const char *format, ...);

函数功能:将数据写入到str的内存空间去,可以把任何数据格式化存放到数组中。返回实际输出到str中的个数。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()
 5 {
 6     int a = 3;
 7     char out_str[8];
 8     memset(out_str, 0x00, 8);
 9     
10     char in_str[] = "123456789";
11     sprintf(out_str, "%s", in_str);
12     
13     printf("a: %d, out_str: %s\r\n", a, out_str);
14    
15    return 0;
16 }

运行结果是:a: 57, out_str: 123456789

发现a的值不对,这为啥呢?

这个就是out_str这个数组内存越界了,但是编译成功,没有任何警告。

如果我们把11行的代码sprintf 替换成snprintf,会怎么样呢?

snprintf(out_str, 8, "%s", in_str);

结果如下:a: 3, out_str: 1234567

可以看到a的值正确,out_str丢失了数据,但是不存在越界的情况了。

这里在介绍下snprintf这个函数