2016-08-10 10 views
-1

以下のコードは間違ったものです.......しかし以下のコードスニペットは同じ出力を生成します。しかし、どちらが正しいですか?

#include <stdio.h> 

void fun(char* msg); 

int main() 
{ 
    char* str = "Hello"; 
    printf("%s\n",str); 

    fun(&str); 

    printf("%s\n",str); 
    return 0; 

} 

void fun(char* msg){ 
    *msg = "World"; 

} 

そして今、正しいコードスニペット

#include <stdio.h> 

void fun(char** msg); 

int main() 
{ 
    char* str = "Hello"; 
    printf("%s\n",str); 

    fun(&str); 

    printf("%s\n",str); 
    return 0; 

} 

void fun(char** msg){ 
    *msg = "World"; 

} 

に正しく上記のコードの目的を動作するようですstrの値を変更することです。 両方のコードが同じ出力を生成しますが、この場合、間違ったコードが正しく動作するように見えます。

+2

コードが未定義のビヘイビアを呼び出すと、時には_うまく動作するように見えます。時間を節約する - コンパイラの警告を有効にします。 – chux

+0

私は "見える"とは言いません - 未定義とは、特定のコンパイラやシステムで、 "未定義"の操作が意図した通りに動作することを意味します。 –

+0

@GovindParmarこのコードは実際には*制約違反ですコンパイラは診断メッセージを発行する必要があります(生成された実行ファイルは無意味です) –

答えて

5

&strchar**であるため、最初はコンパイルしないでください。ただし、関数はchar*となるように宣言されています。

はさらに、*msg = "World";で、"World"char*ですが*msgは、単一charです。