为什么这个struct会崩溃我的程序?
问题描述:
void sortAlphabetically(int listLength, contactInfo* arrayOfStructs)
{
contactType temp;
for (int i = 0; i < listLength; i++)
{
if (strcmp(arrayOfStructs[i].contactName, arrayOfStructs[i+1].contactName) > 0)
{
temp = arrayOfStructs[i]; //swapping entire struct
arrayOfStructs[i] = arrayOfStructs[i+1];
arrayOfStructs[i+1] = temp;
}
}
}
答
下面的表达式是无效的,当i == (listLength-1)
(假设listLength
是元素的数量在arrayOfStructs
计数):
arrayOfStructs[i+1]
答
你应该重复最多只listLength - 1
,或检查你是不是在引用arrayOfStructs[i+1]
之前的最后一个元素。
答
我相信这是因为以下行:
arrayOfStructs[i] = arrayOfStructs[i+1];
arrayOfStructs[i+1] = temp;
更具体地说,i+1
部分。如果您的for
循环从零运行到listLength - 1
,则在最后一次迭代中,您将尝试访问超过实际范围的一个元素。
您可以使用i < listLength - 1
来解决问题,或者只在循环中使用if
语句。改变病情可能是更好的做法。
答
它看起来像你索引断开界数组:
arrayOfStructs[i+1]
我认为listLength
是列表的长度,这意味着它比列表的最后一个元素多了一个。您有条件的i < listLength
让我保持在限制范围内,但不是i + 1。
这可能会或可能不会导致崩溃。
什么错误是你的程序崩溃,到底是什么? – Maxpm 2011-04-14 23:35:46
更好的问题:你为什么要这样做,而不是使用'std :: sort'? – 2011-04-14 23:36:32
@maxpm program.exe已停止工作 – darko 2011-04-14 23:40:02