2011-04-20 42 views
1
#include <stdio.h> 
#include <string.h> 

main() 
{ 
    char tmpChar; 
    char *str_1 = "Hello"; 

    int index; 
    int len = strlen(str_1); 
    for (int i = 0; i < len/2; i++) 
    { 
     index = len - 1- i; 
     tmpChar = str_1[len - i -1]; 
     str_1[index] = str_1[i]; <<<<<--------------- core dumps at this point. Not sure why 
     str_1[i] = tmpChar; 
     printf("str_1[%d] = %c\n", i, str_1[i]); 
    } 
    str_1[len] = '\0'; 
    printf("str_1 = %s\n", str_1); 
} 

回答

1

ISO C99標準已經這樣說的字符串(節6.4.5/6):

它是不確定是否這些陣列是獨特的,只要它們的元素具有合適的值即可。如果程序試圖修改這樣一個數組,行爲是 未定義。

這是因爲,通常情況下,所有字符串文字被集中到一個可能被標記爲只讀的區域,並且它們有時被合併以節省空間。換句話說,兩個字符串文字:

char *p1 = "Googolplex"; 
char *p2 = "plex"; 

可因此存儲:

+--- p1   p2 ---+ 
    |      | 
    V      V 
+---+---+---+---+---+---+---+---+---+---+----+ 
| G | o | o | g | o | l | p | l | e | x | \0 | 
+---+---+---+---+---+---+---+---+---+---+----+ 

這意味着:不要試圖去修改它們。它可能在某些情況下工作,但它不是你應該依賴的東西,如果你重視可移植性甚至一點點。

變化:

char *str_1 = "Hello"; 

到:

char str_1[] = "Hello"; 

,因爲這實際上是一樣的:

char str_1[6]; 
strcpy (str_1, "Hello"); 
5

您試圖修改調用未定義行爲的字符串文字的內容。字符串文字是一般存儲在只讀內存部分,並具有靜態存儲持續時間。

char *str_1 = "Hello";。在這種情況下"Hello"是一個字符串(存儲在只讀部分),並在您嘗試這樣做

str_1[index] = str_1[i]; 

,而不是使str_1的指針文字[即修改內容char *str_1 = "Hello"]使其成爲一組字符,即char str_1[] = "Hello"。文字的內容將被複制到堆棧中,如果您嘗試修改內容,則不會得到任何段錯誤。

+1

+1,因爲你釘它,但字符串_not_「存儲在只讀部分「,標準沒有什麼可說的,只是修改它們是未定義的。 – paxdiablo 2011-04-20 05:37:24

+0

@paxdiablo:是的,你是對的。該標準沒有說任何有關字符串文字存儲的地方,但大多數實現(我知道)將它們存儲在只讀部分。 **一般添加** ** – 2011-04-20 05:40:45

3

變化

char *str_1 = "Hello"; //read only 

char str_1[] = "Hello"; 
+0

這是正確的。如果你會解釋*爲什麼*,你會從我這裏得到讚揚。 – Lindydancer 2011-04-20 05:54:12