2012-03-17 16 views
-4

私はC言語を新しくしています。最初の関数はなぜ機能しますが、2番目の関数は動作しません。なぜこの機能は動作しませんか?

第一:

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

+0

その最初の機能にも面白いビジネスがある - それは動作するのですか?それは確かに警告なしでコンパイルすべきではありません。 –

+0

...あなたはそれらを後方に持ってきましたか? Cのすべての兆候は、2番目のものはほとんど動作するが、最初のものではないが、その逆を示していることを私に伝えている。私はCのポインタに関する詳細な答えを提供することができますが、それがあなたが探しているものではない場合、私はむしろそうではないでしょう。 – FrankieTheKneeMan

答えて

1

&charTestのタイプchar (*)[80]を使用して、char*を初期化すると、最初の例はコンパイルしないでください。あなたは、おそらく意味:

char *test = &charTest[0]; 

または代わり:

第2のケースで
char *test = charTest; 

、あなたは右辺値表現として配列の名前を使用する場合、それはへのポインタにを崩壊します最初の要素。つまり、コンパイラはより明示的なバージョン:&charTest[0]に暗黙的に変換します。

2番目の例はC言語でのみコンパイルされます。C言語で作業している場合は、Cの質問をしてC++でタグ付けしてください。あなたはchar*に(void*です)mallocの結果を回すために明示的なキャストが必要とC++では、それは誤りである:あなたがメモリリークしているこの第二のプログラムで

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

(CまたはCで天気をする++) 。動的に割り当てたメモリはfreeにする必要があります。

関連する問題