2012-10-25 32 views
1

結論:非常感謝大家!下面發佈的所有回覆都是正確的。最初的錯誤是我忘記爲NULL終止符留下空間。 Strcpy()是一個危險的函數,因爲當我使用它時,它不知道'string'的結尾是什麼時候。因此,strcpy()獲取了很多數據並覆蓋了返回地址。函數結束時的C++ Seg Fault。參考線=右大括號

編輯:增加了更多的代碼解決方案

:說實話,我最初的實現是廢話。我甚至不知道爲什麼我要這樣寫交換,如果我想換出數組的元素。 (當時,每個元素只有一個char數組,所以我能夠擺脫舊的實現)。我把它重新寫入到:

與下面的函數結束分段故障
void swap(ArrayElement list[], int index1, int index2) { 
    ArrayElement temp; 
    temp = list[index1]; 
    list[index1] = list[index2]; 
    list[index2] = temp; 
} 

我有問題。

struct ArrayElement { 
    char data[SIZE_OF_ELEMENT]; 
    // Implemented this way so that I can expand to multiple values later on 
} 

//In main: 
ArrayElement* list = new ArrayElement[NUM_OF_ELEMENTS]; 

void swap(ArrayElement list[], int index1, int index2) { 
    char temp[SIZE_OF_ELEMENT]; 
    strcpy(temp, list[index2].data); 
    strcpy(list[index2].data, list[index1].data); 
    strcpy(list[index1].data, temp); 
} 

錯誤是第45行的分段錯誤,它是函數的結束大括號。這是使用g ++編譯的。我使用gbd來嘗試和調試它,一切正常工作,直到它碰到大括號。

如果需要,我可以從程序中提供更多的代碼。我不想發佈整個事情,因爲這是一個班級。

+1

'std :: swap(list [index2] .data,list [index1] .data)'這會爲你工作,只是出於好奇。 – andre

+1

你應該至少顯示你調用該函數的上下文以及什麼'ArrayElement' ... –

+0

你試過了你的調試器嗎? –

回答

4

我最好的猜測是,list[index2].data的字符串大於temp[],並且通過複製,您覆蓋了堆棧和返回地址。

嘗試插入一個測試爲長度:

#include <iostream> 

... 
int n = strlen(list[index2].data); 
std::cerr << "len=" << n << ", SIZE_OF_ELEMENT=" << SIZE_OF_ELEMENT << std::endl; 

和看到的,如果n(列表[索引2]。數​​據)大於SIZE_OF_ELEMENT

+0

你是對的。我得到了len = 240和SIZE_OF_ELEMENT = 30。我不明白這是怎麼回事。 (我已經將更多代碼添加到原始帖子中)。這個實現在使用我自己的測試數據之前已經有效。當我使用教師的文件時,此錯誤開始發生。我將重寫swap以使temp成爲ArrayElement對象,並使用'='進行交換...讓我們看看它是否有效:) –

+0

謝謝你幫助我解決我的問題。如果你想閱讀關於錯誤的結論,我將它添加到原始文章的頂部。 –

2

strcpy是一種有害功能。如果輸入字符串的長度爲SIZE_OF_ELEMENT或更多,則您將寫入temp陣列的末尾。如果您必須在strcpy中使用固定大小的數組作爲輸出數組,則應該在使用該函數之前測試strcpy將工作。

更好的是從使用char陣列切換到std::string

+0

謝謝你幫我解決我的問題。如果你想閱讀關於錯誤的結論,我將它添加到原始文章的頂部。 –

0

數據是這樣定義的char data[SOME_CONSTANT]?如果是這樣,那麼你確定SIZE_OF_ELEMENT夠大嗎?你也記得NULL結束符,right

如果ArrayElement數據的定義如下char *data;,並在以後的時間使用malloc分配後,你肯定指數1具有用於索引2的數據足夠大,反之亦然緩衝區?同樣,你也記得NULL終止符,right

+0

我確實忘記了NULL終止符。那是最初的錯誤。謝謝你幫我解決我的問題。如果你想閱讀關於錯誤的結論,我將它添加到原始文章的頂部。 –