2016-02-08 51 views
-2

我正在使用strchr在遇到=的緩衝區中找到一個點。然後,我改變了這個性格與M相同。我在嘗試執行此操作的行中遇到段錯誤。解引用字符指針會導致段錯誤

這是FULL代碼:

int main(void){ 
    char *buffer = "Name=Tom" 
    char *pointer; 
    pointer = strchr(buffer,'='); 
    *pointer = 'M'; <--------- Segfault Occurs here 
return (0); 
} 

我碰到下面的錯誤與段錯誤:

Process terminating with default action of signal 11 (SIGSEGV) 
Bad permissions for mapperd region at addresss ..... 
+2

請提供[最小完整和可覈查的示例](https://stackoverflow.com/help/MCVE)。你甚至沒有提供對這個問題至關重要的「緩衝區」的定義和內容。例如,如果'buffer'包含一個字符串常量或者不包含任何'='字符,那麼你會得到一個seg錯誤。但不可能用你提供的不完整的代碼來說。 – kaylum

+3

也許找不到字符'=',並且strchr返回NULL –

+0

因爲這個問題似乎被設計爲猜測遊戲,所以我懷疑你已經聲明瞭緩衝區:'char * buffer =「一個緩衝區= something',使它成爲一個常量字面值並且是隻讀的 –

回答

7

你是不是檢查strchr的返回值,也可能是NULL因爲我們沒有看到你的意見。

除此之外,buffer在哪裏以及如何申報?並非所有的char*都可以修改,因爲它們可以存儲在二進制文件的數據段中(作爲字符串文字)。

+0

它不是NULL。我添加了錯誤valgrind顯示時發生段錯誤 –

+0

已加入全部代碼。 –

+2

然後是我指出的第二個原因。該文字只讀且存儲在數據段中,請嘗試char [] buffer =「..」。 – Jack

3

您正試圖修改將存儲在只讀內存段中的字符串文字的值。這會導致訪問衝突。

的問題是在這裏:

char *buffer = "Name=Tom"; 

將其修改爲:

char buffer[] = "Name=Tom"; 
+0

此方法的問題在於,由於您沒有指定緩衝區的大小,因此它會自動設置爲「Name = Tom」的長度加上'\ 0'的長度。所以如果你想放置一個比當前長的字符串,它會給出錯誤。參考這篇舊帖子 http://stackoverflow.com/questions/6803387/why-can-a-string-be-assigned-to-a-char-pointer-but-not-to-a-char-array –

+1

@RatanSenapathy我認爲你完全忽略了這一點。我完全知道如何分配內存...... OP沒有意識到內存被分配的位置以及爲什麼他不能寫入內存。 –

0

什麼,你在這裏做的是錯的:

char *buffer = "Name=Tom"; 

當你將一個字串一個指針被存儲爲const char*,它不能被修改,這是你以後要在你的系統中做的事情碼。

在這裏,你首先需要分配內存以buffer,然後使用strcpy的內容拷貝,如:

char buffer[100]; 
strcpy(buffer, "Name=Tom"); 
+2

這是不正確的,艾哈邁德。嘗試編譯它並嘗試一下。它默默地創建一個'const char *'。 –

+0

是的,你確實是對的。我在編輯。 –

+1

或者只是'char buffer [] =「Name = Tom」;'因爲[David Hoelzer顯示](http://stackoverflow.com/a/35280848/176646)。 – ThisSuitIsBlackNot