2012-03-17 69 views
-4

我是C新手,不明白爲什麼第一個函數可以工作,但不是第二個函數。爲什麼不能使用這個功能?

1:

int main(int argc, char** argv) { 
    char charTest[80] = "this is a test"; 
    char *test = &charTest; 
    strcpy(test, "one"); 

    printf("%s", test); 

    return (EXIT_SUCCESS); 
} 

第二:

int main(int argc, char** argv) { 
    char *test; 
    test = malloc(80); 
    strcpy(test, "one"); 

    printf("%s", test); 

    return (EXIT_SUCCESS); 
} 

有人能告訴我爲什麼? 謝謝;):)。

+11

它以什麼方式*不工作*? – trojanfoe 2012-03-17 23:02:02

+0

第一個功能也有一些有趣的業務 - 你確定它有效嗎?它當然不應該沒有警告地編譯。 – 2012-03-17 23:03:41

+0

......你有沒有落後? C的所有跡象都告訴我第二個幾乎可以工作,但不是第一個,但你表明了相反的意思。我可以在C中提供關於指針的詳細答案,但如果它不是你想要的,我寧願不要。 – FrankieTheKneeMan 2012-03-17 23:04:19

回答

1

第一個示例不應該編譯,因爲您試圖使用&charTest,其類型爲char (*)[80]以初始化char*。你大概的意思是:

char *test = &charTest[0]; 

或者:

char *test = charTest; 

在第二種情況下,當您使用數組的名稱作爲右值表達式,它衰減爲指針第一個元素。也就是說,編譯器會將其隱式轉換爲更加明確的版本:&charTest[0]

第二個例子只在C中編譯,如果你在C中工作,你應該問C語言問題,不要用C++標記它們。在C++中它是一個錯誤,因爲你需要顯式轉換到開啓的malloc結果(這是一個void*)成char*

char * test = static_cast<char*>(malloc(80)); // awkward C++ 

在該第二程序,你正在泄漏存儲器(閹羊在C或C++) 。您應該free您動態分配的內存。