va_list使用及两个注意项(可能导致崩溃和少1个字符)

这篇具有很好参考价值的文章主要介绍了va_list使用及两个注意项(可能导致崩溃和少1个字符)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

两个注意项:

        1、linux平台上vsnprintf会破坏va_list变量,需要重新调用va_start,否则可能访问错位崩溃。

        2、vsnprintf会留一个字节补0结束,但返回值不包含,所以必须判断返回值小于分配的空间。

具体代码分析:

#include<stdio.h>
#include<stdarg.h>

constexpr size_t AUTO_BUF_LEN = 8;

void myPrintf(const char*format, ...)
{
	char buffer[AUTO_BUF_LEN];
	char *pBuf = buffer;
	va_list args;

	va_start(args, format);
	int len = vsnprintf(buffer, AUTO_BUF_LEN, format, args);
	if (len < AUTO_BUF_LEN) // 返回值不包含结束符,必须 <
	{
		printf("%s\n", buffer);
	}
	else
	{
		printf("重新分配空间:%d\n", len);

		// vsnprintf会添加\0结束符,返回值不包含,
		char *buf = new char[len + 1];
		//va_start(args, format); //linux 上必须加这行,vsnprintf会破坏args
		vsnprintf(buf, len + 1, format, args);
		printf("%s\n", buf);
		delete []buf;
	}
	va_end(args);
}

int main()
{
	printf("小于默认空间测试:\n");
	myPrintf("1234567");
	myPrintf("%s", "1234567");
	myPrintf("%s%d", "12345", 67);

	printf("\n等于默认空间测试:\n");
	myPrintf("12345678");
	myPrintf("%s","12345678");
	myPrintf("%s%d", "123456", 78);

	printf("\n大于默认空间测试:\n");
	myPrintf("123456789");
	myPrintf("%s", "123456789");
	myPrintf("%s%d", "1234567", 89);

	getchar();
}

windows运行:

va_list使用及两个注意项(可能导致崩溃和少1个字符),linux文章来源地址https://www.toymoban.com/news/detail-692999.html

到了这里,关于va_list使用及两个注意项(可能导致崩溃和少1个字符)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python中使用selenium进行爬虫时,导致(内存已缓存)备用内存占用过大导致崩溃问题,3个解决方案

    在使用python进行爬虫的时候,使用selenium进行爬取的时候经常会出现已缓存过大的情况,如果缓存出现过大之后再次执行的话就会计算机拒绝,但是这个时候我们的内存又有很多空间可以使用,一开始我以为是占用文件过多然后点360的那个进行文件整理和清理垃圾,结果效果

    2023年04月08日
    浏览(39)
  • JavaScript 使用 splice 方法删除数组元素可能导致的问题

    splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。 JavaScript 遍历数组并通过 splice 方法删除该数组符合某些条件的元素将会导致哪些问题? 当使用 splice 方法从 JavaScript 数组中删除元素时,可能会

    2023年04月23日
    浏览(34)
  • wpf 使用BitmapImage给Image的Source赋值,并释放原占用资源,避免删除原文件时导致程序崩溃

    wpf 使用BitmapImage给Image的Source赋值,并释放原占用资源,避免删除原文件时导致程序崩溃,示例代码如下: 使用这个方法: 请注意,BitmapImage的Freeze方法会将资源从垃圾收集器中释放,因此不会对应用程序的内存使用造成负担。不过请注意,在使用Image控件的时候,最好能及

    2024年01月15日
    浏览(32)
  • 取个对象值导致系统崩溃

    想必各位小伙经常在项目中遇到一些错误,取 对象值的时候 ,经常 报错 ,又或者某些项目突然就 挂 经常都是出现在一些 对象取值上面 ,然后就被领导一顿训斥 例如: 下面这个报错大家想必不会陌生, 就是读取不存在对象的变量 那么为什么我们会遇到这个问题呢? 下面

    2024年02月13日
    浏览(32)
  • Linux--野指针导致的进程崩溃问题

    运行结果:  

    2024年02月14日
    浏览(35)
  • Collectors.partitioningBy使用将List分解成两个集合

    结果:

    2024年02月13日
    浏览(38)
  • 内存越界是否一定会导致程序崩溃吗?详解内存越界

    目录   1、什么是内存越界? 1.1、对数组的读越界  1.2、执行strcpy时的写越界 

    2024年02月03日
    浏览(32)
  • 使用Map.clear()、List.clear()方法,清空时注意!

    对 Map、List 对象进行清空操作时,常常会使用 clear() 方法。 例如,清空 Map 换做 List 也是同样的用法 本文想要说的是,需要注意,如果使用clear()方法, Map被清空的同时,原本对Map的引用会一起被清空!!! 代码举例: 这段代码也很简单,两层循环。 最里层向 listTemp 中添加

    2024年01月20日
    浏览(36)
  • Windows 11又双叒出现Bug,导致截图工具崩溃

    自Windows 11于10月5日正式推送以来,其自身Bug就接连不断。此前就有媒体报道Windows 11影响AMD游戏性能下降问题,不过在10月21日微软发布了KB5006746 (Build 22000.282)更新补丁,彻底解决了上述问题。 间隔不到两周,Windows 11又被曝出Bug。近日有大量网友反映微软截图工具 (snippin

    2024年02月04日
    浏览(40)
  • UE4 内存写坏导致异常崩溃问题记录

    经常出现进程崩溃,崩溃堆栈较为底层 原因基本上都是 read write memory 时触发了异常,盘查后初步怀疑是内存写坏了。 UE 支持各种内存分配器: TBB Ansi Jemalloc Stomp 还有自带的内存分配器: Binned Binned2 Binned3 可以参考文章 UE 中的内存分配器。 其中 Stomp 是引擎提供的排查内存写

    2023年04月21日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包