2017-03-17 90 views
0

我正在使用c9編譯器得到堆棧粉碎錯誤,我查找錯誤的原因,這是錯誤的代碼/傳遞變量或未聲明/初始化的東西,但我不能找到錯誤在我的代碼...使用C9.io和C++堆棧粉碎錯誤

我已經剝離的,不屬於錯誤的任何不必要的代碼下面的代碼,這是我所:

#include <iostream> 
#include <cstring> 

using namespace std; 

void checkWord(char *word, int size); 

int main() { 
    string word1 = "racecar"; 
    char wordArr[sizeof(word1)]; 
    strcpy(wordArr, word1.c_str()); 
    checkWord(wordArr, strlen(wordArr)); 

    string word2 = "something"; 
    char word2Arr[sizeof(word2)]; 
    strcpy(word2Arr, word2.c_str()); 
    checkWord(word2Arr, strlen(word2Arr)); 
} 

void checkWord(char *wordArr, int size) { 
    // cout << "Size1: " << size << endl; 
    int workingSize; 
    if ((size % 2) != 0) { 
     workingSize = (size +1)/2; 
    } else { 
     workingSize = size/2; 
    } 
    char *p, *q; 
    p = wordArr; 
    q = wordArr+strlen(wordArr)-1; 
    bool pal = true; 
    for (int i = 0; i < workingSize; i++) { 
     if (*p != *q) { 
      pal = false; 
     } 
     p++; 
     q--; 
    } 
} 

這給我這個錯誤輸出:

*** stack smashing detected ***:/home/ubuntu/workspace/.c9/metadata/workspace/3_16Lab2.cpp.o terminated 
bash: line 12: 48077 Aborted     $file.o $args 


Process exited with code: 134 

否則,程序執行時沒有任何問題,並且在這種情況下確認單詞「racecar」和「something」是否是迴文。

+0

從'string'到'char *'的轉換看起來沒有必要。 – Arash

回答

0

您聲明char wordArr[sizeof(word1)];這是一個字符短。 Sizeof給出了字符串中的字符數量,但是您需要多一個字符來跟蹤尾部'\0'。因此,你開始覆蓋你不擁有的內存,並且超出這個範圍的任何東西都是隨機未定義的行爲。

0

sizeof(word1)返回變量word1佔據的字節數,這與它所表示的字符串的長度無關。您應該使用word1.length() + 1來獲取字符串的長度,包括終止的nul字符。 (同樣的sizeof(word2)。)

一個更好的解決辦法是要麼改變checkWord把它的第一個參數作爲const char *wordArr,並通過使用word1.c_str()這個詞,或者只是把這個字符串傳給checkWord,而不是使用字符指針在所有。