本文主要是介绍snprintf参数类型不严格匹配导致的天大的坑“(null)”------这次不说core dump问题了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我们之前说过, snprintf类型不匹配, 容易导致core dump, 今天我们说点别的。
协议文件中定义了long, 经序列化后, 变成了C++中的long long, 然后在使用snprintf时候就没有严格匹配, 导致了天大的坑。 在繁杂的代码中排查好久, 逐步缩小范围, 才找到原因。
为了简便起见, 直接上代码:
#include <iostream>
#include <string>
using namespace std;int main()
{long long x = 1234;char szBuf[128] = {0};snprintf(szBuf, sizeof(szBuf), "haha%d,%s", x, "5678");printf("%s\n", szBuf);return 0;
}
我们大概以为结果是:
haha1234,5678
实际结果是:
haha1234,(null)
我们还可能以为, long long形式的x转成int形式的x, 不还是1234吗? 和int x有什么差别呢?
这种以为就太武断了, 历史经验告诉我们, 不要依赖于未定义的行为。
还是老老实实用%lld吧, 或者把long long强转为int. 关于snprintf, 也可查查源码。
遇到这种问题, 要用“最小化”和“”“对照”法来定位。
这篇关于snprintf参数类型不严格匹配导致的天大的坑“(null)”------这次不说core dump问题了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!