为什么这个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; 
     } 
    } 
} 
+0

什么错误是你的程序崩溃,到底是什么? – Maxpm 2011-04-14 23:35:46

+0

更好的问题:你为什么要这样做,而不是使用'std :: sort'? – 2011-04-14 23:36:32

+0

@maxpm program.exe已停止工作 – darko 2011-04-14 23:40:02

下面的表达式是无效的,当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。

这可能会或可能不会导致崩溃。