[英]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.