簡體   English   中英

使用C9.io和C ++的堆棧粉碎錯誤

[英]Stack Smashing Error using C9.io and C++

我正在使用c9編譯器收到堆棧粉碎錯誤,並且我查找了錯誤原因,該原因可能是錯誤的代碼/傳遞變量或未聲明/初始化的內容,但我在代碼中找不到錯誤。 。

我刪除了以下與該錯誤無關的不必要代碼,這就是我所擁有的:

#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”一詞是否是回文。

您聲明char wordArr[sizeof(word1)]; 這是一個短字符。 Sizeof給出了字符串中的字符數,但是結尾的'\\0'還需要一個字符數。

結果,您將開始覆蓋您不擁有的內存,除此之外的任何事情都是隨機的未定義行為。

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

更好的解決方案是更改checkWord使其第一個參數為const char *wordArr ,並使用word1.c_str()傳遞單詞,或者僅將字符串傳遞給checkWord而不使用字符指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM