问题可能很简单,但经过数小时的研究和编辑后,我无法让它工作,所以我在这里发布我的问题。
我正在尝试创建一个接收单个数字整数或两个数字整数的函数,并在将其转换为两个整数格式(例如7到07)后将其作为字符串返回。
char *to_two_digits(int num) {
char num_str[4];
sprintf(num_str, "%d", num);
int length = sizeof(*num_str) / sizeof(char);
static char *return_string;
if (length == 1) {
sprintf_s(return_string, "0%d", num);
return return_string;
}
else if (length == 2) {
*return_string = *num_str;
return return_string;
}
else {
printf("Error! Number cannot be represented as a two-digit.");
exit(1);
}
}
运行sprintf_s()函数时函数失败,并显示错误:
--------------------------- Microsoft Visual C ++运行时库-----------
Debug Assertion失败!
文件:minkernel \ crts \ ucrt \ src \ appcrt \ stdio \ output.cpp
行:261
表达式:format!= nullptr
问题是什么,我该如何解决?提前谢谢。
答案 0 :(得分:2)
您正在将空指针传递给sprintf_s
函数。您在此行中声明的指针
static char *return_string;
从未被初始化为指向任何事物。由于它被声明为静态,因此它被预先初始化为零(而不仅仅是具有不确定的值)。
这是消息告诉你的内容。 assert
代码中有一个sprintf_s
,用于检查您是否未传递空指针,这就是触发。
您应该传入指向函数可以写入的缓冲区的指针。但是由于你使用的是C ++,你真的应该使用std::string
,然后你可以从函数返回而不需要静态变量。
答案 1 :(得分:0)
正是它所说的 - 你将空指针传递给sprintf_s
。
这是return_string
,你没有初始化指向任何东西,更不用说实际结果的足够大小的缓冲区了。由于是static
,它确实是一个空指针,而不是具有不确定的价值,但这种保证对你没有帮助。
将static
用于此类内存管理实际上并不是一个好主意,因为您的功能是100%不可重入的。通常,您的用户会在结果中传入足够大小的缓冲区,并让调用范围处理缓冲区的生命周期。