2014-02-07 22 views
0

我將目標的大小定義爲string1的大小。然後我添加了string2到目標。我沒有增加我的目標的大小。爲什麼我的靜止代碼工作?每當我更改其內容時,是否需要更改我的字符指針的大小?

char *string1 = "this is a "; 
char *target = malloc(sizeof(string1)); // if i don't do this, code gives error. 
strcpy(target, string1); 
printf("%s\n", target); 

char *string2 = "string"; 
strcat(target, string2); // how come I don't need to call malloc again? 
printf("%s\n", target); // works 

我在Mac上用Xcode編譯了這個。

+3

您的代碼從頭到尾都是錯誤的。 – cnicutar

+0

sizeof(string1)是4(取決於機器),因爲指針存儲爲整數。 –

+0

使用'char * target = malloc(strlen(string1)+ 1);'。然後在'strcat()'之前使用'target = realloc(target,strlen(string1)strlen(string2)+ 1);' – chux

回答

1

它工作是因爲你很幸運。在緩衝區末尾寫入是一種很好的方法,可以破壞緩衝區後面的數據,並導致程序以令人討厭的方式爆炸。

其實你第一次很幸運。 Sizeof返回變量類型的大小,它是一個指針,不是字符串的長度。即使你使用了strlen(string1),你也必須加1來允許空字符結束字符串。

C會讓你拍攝自己的腳。您有責任確保您沒有,並且/或者使用類似lint等工具對您的代碼執行其他測試,以捕獲其他語言經常檢查的錯誤。 (或者在更高的警告級別運行你的編譯器。)

從另一方面來說,當你真的想做的事情能夠在C中作弊時,它就是強大的東西之一 - 比如彙編代碼,如果你知道什麼你在做什麼,你可以違反規則做一些事情,否則很難做到不可能。這是一把鋒利的刀。萬一它滑倒,要小心瞭解你周圍的事物。

1

您的代碼中存在一些問題。

  1. 你認爲sizeof(string1)應該返回什麼?你嘗試過嗎?你知道sizeof()strlen()之間的區別嗎?順便說一句,sizeof(string1)將返回指向char的指針的大小(通常爲4個字節)。

  2. 檢查strcat()documentation

「目的地:指向目標陣列,它應包含一個C 串,並且是足夠大,以包含級聯所得 字符串」

如果它「有效」幾次,並不代表代碼是正確的。您必須明白,您正在將信息寫入您未分配的一段內存中。

相關問題