我无法相信我无法做到这一点!有人请帮忙! 这个单词在没有被初始化的情况下被使用(这是必需的吗?):
int main(int argc, char* argv[])
{
char* word;
sprintf(word,"%d",12);
std::cout << word;
return 0;
}
如果我这样做,它会给DEBUG ASSERTION FAILED!:
int main(int argc, char* argv[])
{
char* word = NULL; // char* word = nullptr;
sprintf(word,"%d",12);
std::cout << word;
return 0;
}
我已经包含了stdio.h标头。我是如何摸索这一点的,这是没有意义的。
答案 0 :(得分:2)
您需要使用已分配的内存对其进行初始化。
char word[20];
或
char* word = new char[20];
将其初始化为NULL将使其在函数尝试写入此地址时崩溃。不初始化它也将是未定义的行为,因为地址将是垃圾。
答案 1 :(得分:1)
这些代码段都是未定义的行为。
在第一个中,指针word
未初始化,因此其值是不确定的(并且似乎是随机的),因此在使用写入数据时,您不知道 where 它将被写入。
第二个将始终写入地址零,这也是未定义的行为。
解决这个问题的方法是记住你使用的是 C ++ ,它有std::string
:
std::string word;
word = "12";
或者,如果您将数字作为要使用的整数,请查看std::ostringstream
:
int value = 12;
// ...
std::ostringstream os;
os << value;
std::string word = os.str();
答案 2 :(得分:0)
你宣称word
为指针:什么?
如果您需要字符串,并且仍想使用sprintf
,则必须声明其长度:
char word[20]; // twenty bytes including string terminator \0
这种固定长度的语法容易出错并且现在已经过时了:请参考@Joachim Pileborg答案,以便更好地使用C++
中的字符串