2011-05-14 121 views
4
char* foo = (char*) malloc(sizeof(char)*50); foo = "testing"; 

在C中,我可以看到該字符串的第一個字符:更改字符數組的價值觀

printf("%c",foo[0]); 

但是,當我試圖改變該值:

foo[0]='f' 

它給錯誤在運行時。

我該如何改變這個動態分配的char數組的值?

回答

8

您正在將foo設置爲指向字符串文字("testing")而不是您分配的內存。因此,您正嘗試更改常量的只讀內存,而不是分配的內存。

這是正確的代碼:

char* foo = malloc(sizeof(char)*50); 
strcpy(foo,"testing"); 

甚至更​​好

cont int MAXSTRSIZE = 50; 
char* foo = malloc(sizeof(char)*MAXSTRSIZE); 
strncpy(foo,"testing",MAXSTRSIZE); 

防止緩衝區超限運行的脆弱性。

+3

不要投你的malloc。 char * foo = malloc(sizeof(char)* MAXSTR); – zellio 2011-05-14 16:27:36

+0

@Mimisbrunnr - 當然。 – Hogan 2011-05-14 18:17:05

1

使用字符串時,不應通過賦值運算符(=)賦值。這是因爲字符串不是實際的類型,它們只是字符指針。相反,你必須使用strcpy

您的代碼存在的問題是您已爲foo分配了內存,然後您將foo重新分配給了另一個READONLY內存地址。當您分配給foo[0]時,您會遇到運行時錯誤,因爲您正在嘗試寫入只讀內存。

通過這樣做修復您的代碼:

char* foo = malloc(50); 
strcpy(foo, "testing"); 

這工作,因爲foo指向你分配的地址。

+0

如果爲foo [0]賦值意味着重新賦值變量,那麼賦值給foo [1]是什麼意思? – 2011-05-14 16:21:11

+0

@gcx - 同樣的事情只是指向常量字符串中的'e'而不是't'。 – Hogan 2011-05-14 16:23:16

+1

不,'foo =「testing」'將變量重新分配給一個地址(與您分配的地址不同)。 – Marlon 2011-05-14 16:23:20

2

你的問題是你正在改變指針引用。

這樣做:

char* foo = (char*) malloc(sizeof(char)*50); foo = "testing"; 

您分配富指針到某處存儲"testing"字符串(母雞運行時錯誤我猜的),而不是新分配的空間。

希望這會有所幫助