2011-11-26 108 views
-3

可能重複:
Modifying C string constants?字符串差異

什麼是字符*海峽之間的區別使用malloc時或沒有?

int i; 
char *s = (char*)malloc(sizeof(char)*27); 
for(i=0;i<26;i++) 
    s[i]='a'+i; 
s[26]='\0'; 
printf("%s\n",s); 
reverse(s); 
printf("%s\n",s); 

其中反向()是

void reverse(char *str) 
{ 
    int i,j=strlen(str)-1; 
    char tmp; 
    for(i=0;i<j;i++,j--) 
    { 
    tmp=str[i]; 
    str[i]=str[j]; 
    str[j]=tmp; 
    } 
} 

這工作得很好,但在使用

char *t = "new string"; 
printf("%s\n",t); 
reverse(t); 
printf("%s\n",t); 

我得到一個段錯誤和調試器說,這是在strlen的反向。將char * t更改爲char t []可以正常工作。是什麼賦予了?

+2

Duplicates:http://stackoverflow.com/questions/2124600/how-to-reverse-a-string-in-place-in-c-using-pointers http://stackoverflow.com/questions/480555/修改c字符串常量http://stackoverflow.com/questions/1011455/is-it-possible-to-modify-a-string-of-char-in-c http://stackoverflow.com/questions/ 164194/why-does-simple-c-code-receive-segmentation-fault – nos

回答

5

這是正常的:

char * t = "new string"; 

t指向一個字符串。修改它會導致未定義的行爲,並且大多數實現將這些文字存儲在只讀內存部分中。在你的情況下,你有一個段錯誤,但有時它會看起來像它的工作。

char *s = (char*)malloc(sizeof(char)*27); 

這分配了一塊新的內存。既然那段記憶屬於你,你可以隨心所欲地做。

+0

爲什麼不只是'char xxx [27]'?爲什麼'sizeof(char)'?它總是1. – 2011-11-26 00:06:36

+0

@Vlad不要問我,我個人會拋棄C並使用C++的'std :: string'。 –

+0

C++不是一個選項,謝謝你的信息 – Mike