我有一个用c ++编写的银行系统应用程序,它包含一个指向对象的指针数组。该程序似乎在使用Ubuntu 12.04时有效,但是当在阵列中只有一个对象的情况下在以下循环中运行时,它会崩溃。
if(tempPtr->getAccount()->hasCustomer() == true)
{
while(tempPtr->getAccount()->getCustomer()[i] && i<4)
{
tempPtr->getAccount()->getCustomer()[i]->showCustomerDetail();
i++;
}
//...
我有一个类似的数组,但是当它是空的时打印出“1.66912-e-307 - ”的字符串,但是在我添加字符串后立即工作。
任何帮助将不胜感激 感谢
答案 0 :(得分:2)
该行
while(tempPtr->getAccount()->getCustomer()[i] && i<4)
很可疑。做到这一点
while(i<4 && tempPtr->getAccont()->getCustomer()[i])
以避免未定义的行为(如果数组的大小为4)。
答案 1 :(得分:1)
你没有检查边界。确保您始终读取为阵列分配的内存。使用valgrind或类似的东西确保你没有这样的问题。
如果没有,实际上,您将退出阵列并读取随机数据,或者在分配的内存之外跳过并使程序崩溃。标准中的确切行为是未定义的,取决于平台/编译器的组合,但它始终是一个不好的标志。
答案 2 :(得分:0)
两个操作系统之间存在一些差异,但与字符相关,Windows上的unicode为UTF-16LE,每个字符为2或4个字节。 Linux使用UTF-8,每个字符在1到4个字节之间。
这是一篇很好的文章,可能有帮助The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
答案 3 :(得分:0)
我已经成功解决了这个问题。为了能够在Windows上正确运行它,我刚刚改变了......
if(tempPtr->getAccount()->hasCustomer() == true)
{
while(tempPtr->getAccount()->getCustomer()[i+1] && i<4)
{
tempPtr->getAccount()->getCustomer()[i]->showCustomerDetail();
i++;
}
}