看來我是被卡住了一些基礎知識。有人可以解釋我爲什麼下面的代碼:指針,指向函數的字符串
#include <stdlib.h> void Test1(char *t) { t = (char *)malloc(11); strcpy(t, "1234567890"); } void Test2(char **t) { *t = (char *)malloc(11); strcpy(*t, "1234567890"); } void Test3(char *t) { strcpy(t, "1234567890"); } char * Test4(char *t) { t = (char *)malloc(11); strcpy(t, "1234567890"); return t; } int main() { char *t1 = NULL; Test1(t1); printf("\nTest1: %s\n", t1); char *t2 = NULL; Test2(&t2); printf("\nTest2: %s\n", t2); char *t3 = (char *)malloc(11); Test3(t3); printf("\nTest3: %s\n", t3); char *t4 = NULL; t4 = Test4(t4); printf("\nTest4: %s\n", t4); return 0; }
給出了這樣的輸出:
Test1: (null) Test2: 1234567890 Test3: 1234567890 Test4: 1234567890
這有什麼錯Test1的功能?爲什麼Test4與Test1幾乎相似? 更一般的問題:在函數中創建字符串並返回指針的正確方法是什麼?
您已經標記了C++和C,而這取決於在C++中,你應該使用`std :: string`(除非有一些迫切需要!),在C中,除了第一種方法都是可能的。 – Nim 2011-01-07 14:52:33
是的,我可以使用字符串類,但我想了解核心,這就是爲什麼我在這裏使用char *。 – clumpter 2011-01-07 15:46:23
在C中,do * NOT *強制轉換了`malloc()`的結果。在這裏閱讀推理:http://stackoverflow.com/a/605858/1701799(基本上,這是因爲一個`void *`會自動安全地升級到適當的類型)。我知道這被標記爲C/C++,但沒有這樣的語言「C/C++」。如果這是C++,那麼您將使用`#include`而不是`#include `。我認爲這應該只是被標記爲C.在C++中,你幾乎不會使用`malloc()```free()`,而是使用`new/delete`,或者更好的智能指針/ etc .. –
RastaJedi
2016-02-22 05:35:12