最近在做项目的时候遇到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这个函数
函数原型:snprintf(char *str, size_t size, const char *format, ...);
函数功能:snprintf 会将格式化后的字符串写入到 str
中,但不会超过 size-1
个字符,以确保在字符串末尾添加了一个 null 终止符。
所以大家以后尽量用snprintf这个函数。
谢谢观看^_^