sprintf_s()失败并显示“debug assertion failed”错误

时间:2016-06-17 15:35:25

标签: c++

问题可能很简单,但经过数小时的研究和编辑后,我无法让它工作,所以我在这里发布我的问题。

我正在尝试创建一个接收单个数字整数或两个数字整数的函数,并在将其转换为两个整数格式(例如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

问题是什么,我该如何解决?提前谢谢。

2 个答案:

答案 0 :(得分:2)

您正在将空指针传递给sprintf_s函数。您在此行中声明的指针

static char *return_string;

从未被初始化为指向任何事物。由于它被声明为静态,因此它被预先初始化为零(而不仅仅是具有不确定的值)。

这是消息告诉你的内容。 assert代码中有一个sprintf_s,用于检查您是否未传递空指针,这就是触发。

您应该传入指向函数可以写入的缓冲区的指针。但是由于你使用的是C ++,你真的应该使用std::string,然后你可以从函数返回而不需要静态变量。

答案 1 :(得分:0)

正是它所说的 - 你将空指针传递给sprintf_s

这是return_string,你没有初始化指向任何东西,更不用说实际结果的足够大小的缓冲区了。由于是static,它确实是一个空指针,而不是具有不确定的价值,但这种保证对你没有帮助。

static用于此类内存管理实际上并不是一个好主意,因为您的功能是100%不可重入的。通常,您的用户会在结果中传入足够大小的缓冲区,并让调用范围处理缓冲区的生命周期。