2017-03-17 9 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)];は1文字短いと宣言します。 Sizeofは文字列の文字数を示しますが、末尾には'\0'の文字列が1つ必要です。

結果として、あなたが所有していないメモリを上書きし始め、それ以上のものはランダムな未定義の動作です。

0

sizeof(word1)は、変数word1が占めるバイト数を返します。これは、それが表す文字列の長さとは関係ありません。終了するヌル文字を含めて、文字列の長さを取得するには、word1.length() + 1を使用する必要があります。 (sizeof(word2)のと同じ。)

よりよい解決策は、どちらかになりconst char *wordArrとしての最初のパラメータを取り、word1.c_str()を使用して単語を渡し、または単にcheckWordに文字列を渡すと、すべての文字のポインタを使用しないようにcheckWordを変更します。

関連する問題