首页 > 系统相关 >sprintf函数内存越界

sprintf函数内存越界

时间:2023-10-25 23:15:26浏览次数:35  
标签:char 函数 snprintf 内存 越界 sprintf str out

最近在做项目的时候遇到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这个函数。

谢谢观看^_^

标签:char,函数,snprintf,内存,越界,sprintf,str,out
From: https://www.cnblogs.com/zzkino/p/17498645.html

相关文章

  • 影驰HOF PRO DDR5-8000 24GB内存评测:延迟不到55ns 游戏最低帧暴涨37%
    一、前言:低延迟低电压的单条24GB内存对于高端玩家来说,现在32GB(16GBx2)内存的确有点拿不出手,而64GB内存(32GBx2)虽然容量够了,但是单条32GB不仅价格昂贵,内存的时序和频率都要做妥协,整体性能与16GB版本相差甚远。相比之下,单条24GB内存能在容量和性能之间获得一个完美的平衡,因此现在越......
  • [C语言]整数在内存中的存储
    1、......
  • 由遍历二维数组的方式引出缓存内存cpu
    对于二维数组,想要遍历的话,一行一行读和一列一列都读可以,但是大多数情况都选择一行一行,为什么呢?涉及到一个缓存的概念,一般都是cpu去计算,它会先去缓存找,如果找不到才去内存,先说缓存,一般缓存就是类似于一行一行,有个临近效应,顺便把旁边的也读了,十分方便,这就是缓存,入股一列一列,读完......
  • 内存泄漏常见情况及处理方法
    内存泄漏可以被视为你家中的水泄漏;虽然一开始小滴水可能看起来不是什么大问题,但随着时间的推移,它们可能会造成重大损失。同样,在JavaScript中,当不再需要的对象没有从内存中释放时,就会发生内存泄漏。随着时间的推移,这种累积的内存使用可以减慢甚至崩溃应用程序。定义:当不再用到的对......
  • linux中执行uefi runtime service call的内存上下文切换
    当linuxkernel从UEFI启动之后尽管bootservice退出了但是仍然可以使用runtimeservice。这就引发了一个问题:存在于uefi内存空间的code如何被kernel调用。首先找一个调用efiruntimeservice的例子:staticvoidefi_call_rts(structwork_struct*work){...switch(e......
  • linux 内存盘的使用方式与验证
    linux内存盘的使用方式与验证背景某些情况下,硬盘的写入是一个很大的瓶颈使用内存文件系统的方式应该能够极大的提高IO的速度.内存盘的优点是比较快,缺点就是数据不是持久化的.其实还是有很多可以持续优化的方式与方法的.可以最大化的磁盘的IO速度等.内存盘的多种模......
  • 五大内存分区
    c/c++:五大内存分区(笔记)_内存有那5部分_深海中的咸鱼的博客-CSDN博客java:Java5大内存区域-CSDN博客......
  • 《面试1v1》JVM内存模型
    我是javapub,一名Markdown程序员从......
  • malloc划分内存空间大小
    今天写c语言,犯了一个很失败的错误,类似于typedefint*intp;intpptr=(intp)malloc(sizeof(intp));如果是int,那么本身占用内存就很小,也许能正确运行代码,但是如果内存空间大一点的,肯定直接报错了,因为划分的还没要用的多,。。。。编译器也不会报错。。。......
  • python内存监测工具memory_profiler
    内存监测工具memory_profiler目录内存监测工具memory_profiler安装参数注解简单使用输出在日志中mprof使用参考资料memory_profiler是Python的一个第三方库,其功能时基于函数的逐行代码分析工具memory_profiler是一个监控进程内存消耗的模块,也可以逐行分析Python程序的内存......