2012-02-05 238 views
9

我想在C上做一些真正基本的事情,但是我一直在收到段錯誤。我想要做的就是用一個不同的字母替換一個字母的字母 - 在這個例子中,用l代替l。任何人都可以幫助解釋我出錯的地方嗎?這應該是一個非常基本的問題,我想我不知道爲什麼它不起作用。替換字符串中的單個字符元素C

#include<stdio.h> 
#include<stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    char *string1; 

    string1 = "hello"; 
    printf("string1 %s\n", string1);  

    printf("string1[2] %c\n", string1[2]); 
    string1[2] = 'L'; 
    printf("string1 %s\n", string1); 

    return 0; 
} 

對於我的輸出我得到

字符串1個招呼
字符串1 [2]升
分段故障

謝謝!

+0

String1是一個指向只讀內存的指針(在大多數系統中),因爲它是一個常量初始化程序。如果不先複製,則無法寫入該字符串。 – gaige 2013-04-16 01:45:57

回答

14
string1 = "hello"; 
string1[2] = 'L'; 

can't change string literals,這是不確定的行爲。試試這個:

char string1[] = "hello"; 

或許:

char *string1; 
string1 = malloc(6); /* hello + 0-terminator */ 
strcpy(string1, "hello"); 

/* Stuff. */ 

free(string1); 
+0

好的,謝謝你!我會放棄這一點。 – user1163974 2012-02-05 12:51:48

+0

沒什麼大的,但你可以使用strdup(「hello」)而不是調用malloc和strcpy。 strdup爲你做這個,使用起來更方便 – Zoneur 2012-02-05 13:32:27

+0

@Zoneur Yup,我經常推薦'strdup',但它有時會有問題,因爲它不是標準的。 – cnicutar 2012-02-05 13:33:51

3
char *string1; 
string1 = "hello"; 

string1指向一個字符串字面量和字符串是不可修改的。

你可以做的是用字符串文字的元素初始化一個數組。

char string1[] = "hello"; 

string1數組的元素是可修改的。

0
string1[2] = 'L'; 

你正在試圖改變一個字符串這是C. 不確定的行爲而是使用string1[]="hello";你 分段故障是因爲文字是可能存儲在存儲器的只讀部分,並試圖寫入它會產生未定義的行爲。

1
char *string1 = "hello"; 

運行代碼時,字符串文字將位於只讀區域。操作系統不允許代碼改變這塊內存,所以你會得到一個seg-fault。

char string1[] = "hello"; 

當您運行代碼時,字符串文字將被壓入堆棧。