我正在尝试使用cout
从称为charArray
的动态分配2D字符数组中打印出c字符串。我正在打印的代码段在这里:
for(int k=0; k<intSize; k++)
{
std::cout<<"hello"<<std::endl;
std::cout<<charArray[intSize-1-k]<<std::endl;
}
for(int i = 0; i<intSize; i++)
{
delete [] charArray[i];
std::cout<<i<<std::endl;
}
delete [] charArray;
intSize
是charArray
中有多少个C字符串。但是,当我运行程序时,"hello"
只打印一次,而没有其他内容打印,在第二个for循环中没有charArray
或i。我已经在代码中更早确认了通过成功使用charArray
可以正确填充cout
。我运行gdb尝试查找问题,并且在gdb中,for循环已完全迭代,因此出于某种原因,第一个cout
之后,cout停止工作。我还尝试在每次cout
之后刷新,但还是一样。
答案 0 :(得分:1)
尝试一下:
#include <iostream>
int main()
{
const char*nul = nullptr;
std::cout << "before "<< nul << "after\n";
}
输出将是:
before
这就是您正在发生的情况-您正在尝试打印nullptr字符串。
charArray[intSize-1-k]
之一为空。可能会无限制地阅读。编写空字符串会将badbit设置为std::cout
。
要避免这种情况,您可以做两件事:
在打印之前验证char*
是否为空。
std::cout.exceptions(std::ostream::failbit);
将使operator<<
在有问题的代码行引发异常。调试器可以捕获异常,并让您轻松查找错误(gdb具有catch throw
)。如果您有异常处理程序,请不要忘记让它调用std::cout.clear();
。