我有一個簡單的函式應該將小寫字符轉換為大寫。但在某個時刻,我得到了一個總線錯誤。這個錯誤是什么意思,如何解決?
PS我一直試圖弄清楚這個錯誤意味著什么,結果我無法弄清楚總線錯誤和分段錯誤之間的區別是什么
void *to_upper(const char *str) {
char *strCopy = (char *)str;
int strLength = strlen(strCopy);
for (int i = 0; i < strLength; i ) {
if (strCopy[i] >= 'a' && strCopy[i] <= 'z') {
strCopy[i] = (int)strCopy[i] - 32; // ERROR -> zsh: bus error ./a.out
}
}
return strCopy;
}
printf("to_upper: %s", (char *)to_upper("TeSt"));
uj5u.com熱心網友回復:
有關“總線錯誤與分段違規有何不同”的答案,請參閱此問題。
至于為什么您會遇到總線錯誤,您實際上是在修改字串文字,正如一些程式員老兄在對您的 OP 的評論中所說的那樣。原因如下:
- 您使用“TeSt”作為引數呼叫您的函式。
- 函式引數
str
被分配了字串文字“TeSt”的位置,該位置位于程式的不可修改區域中。 - 你說
char *strCopy = (char *) str
,就是說strCopy
應該指向同一個位置str
。如果您想實際復制字串,請strdup(str)
改用。 - 當您說
strCopy[i] = ...
時,由于上述原因,這是試圖更改您無權訪問的記憶體區域中的值。這就是您收到總線錯誤的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/470623.html
標籤:C
上一篇:C-對動態大小的字串陣列進行排序