2012-08-13 96 views

回答

3

這是未定義的行爲。你不能改變文字。

有一個指針指向字面,它應該是:

const char* str = "Hello"; 
//^^^^^ 

然後,爲了能夠改變字符串,這是應該的,例如

char str[] = "Hello"; 

另一種選擇是分配動態存儲器(使用mallocfree

+0

因此,編譯器發現錯誤,或者當我嘗試重寫那個內存位置時,程序崩潰了? – user1091856 2012-08-13 07:21:11

+0

@ user1091856 - 如果編譯器已經捕獲到它,那麼會出現編譯器錯誤。如果程序崩潰,它會立即退出。但沒有必要崩潰。你不能改變這個記憶,如果你想改變它,任何事情都可能發生。這就是爲什麼它是_undefined behaviour_。 – 2012-08-13 07:23:20

1

因爲str的類型是「const char *」,所以你不能覆蓋它指向的對象。

+0

如果你的意思是文字,它在技術上是'const char [6]',而不是'const char *'。 – chris 2012-08-13 07:19:00

+0

在類型安全方面...是的 – Yang 2012-08-13 07:23:53

2

字符串文字被分配在只讀存儲器中。所以基本上它們是類型的(const char *)。它不能被改變。 另請參閱this瞭解更多信息。

0
#include <string.h> 
char *str; 
if((str = malloc(strlen("hello"))) != NULL) 
    return (null); 
str = strcpy(str, "hello"); 
printf("%s\n", str); // should print hello 
str[2] = '3'; 
printf("%s\n", str) // should print he3lo 

的這裏的事情是我先分配內存來設置字符串中的字符。 但是,如果你不擅長分配,你可以隨時設置char str [] =「hello」;

+1

問題是,爲什麼在不需要時使用堆分配?它導致的一件事是缺少「免費」電話。 – chris 2012-08-13 07:31:02

+0

對此。不過,它是查看不同選項的好方法 – C404 2012-08-13 07:59:54

0

str的內存將分配在.rodata部分。所以試圖修改只讀數據會產生問題。

以下問題出現問題。

#include <stdio.h> 

int main() 
{ 
char * str = "Hello"; 

printf("\n%s \n", str); 
*(str+1) = '3'; 
printf("\n%s \n", str); 


return 0; 
} 

對應的拆卸

.file "dfd.c" 
     .section  .rodata 
.LC0: 
     .string "Hello" 
.LC1: 
     .string "\n%s \n" 
     .text 
    ..... 
    ..... 

,其結果是

Hello 
Segmentation fault (core dumped) 

im使用上X86_64 gcc版本4.6.3(Ubuntu的/ Linaro的4.6.3-1ubuntu5)。

0

str是一個指向字符串常量的指針,並且該字符串的內存分配在只讀段中。如果你嘗試修改字符串內容,結果是不確定的。但是,與總是綁定到相同內存位置的數組名相比,您可以修改指向其他指針的指針。