我正在尝试使用cout
从动态分配的名为charArray
的2D char数组中打印出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"
被打印一次,没有其他打印,而不是charArray
和i在第二个for循环中。我之前在代码中已经确认charArray
已成功使用cout
正确填充。我运行gdb尝试找到问题,并在gdb中for循环完全迭代,所以由于某种原因在第一个cout
后,couts停止工作。我也尝试在每次cout
之后冲洗,但仍然是同样的事情。
试试这个:
#include <iostream>
int main()
{
const char*nul = nullptr;
std::cout << "before "<< nul << "after\n";
}
输出将是:
before
这就是你发生的事情 - 你正在尝试打印一个nullptr字符串。 charArray[intSize-1-k]
之一是null。可能读出它的界限。写一个空字符串会将badbit设置为std::cout
。
为避免这种情况,您可以做两件事:
char*
不为null。std::cout.exceptions(std::ostream::failbit);
将使operator<<
在违规代码行中抛出异常。调试器可以捕获异常,让您轻松找到您的错误(gdb有catch throw
)。如果你有一个异常处理程序,不要忘记让它调用std::cout.clear();
。