2016-05-30 4 views
0

これは私のコードです。このコードはうまく動作します。 しかし、 "cout < <" Hello world! "の" endl "を削除すると、< < endl;"が実行されません。 This is what I get when delete endlcout << "hello" << endlでC言語のプログラムが動作を停止しました

#include <iostream> 
#include <cstring> 

using namespace std; 
int main() 
{ 
    char * name; 
    char * n = "aaaa"; 
    strcpy(name, n); 
    cout << name; 
    cout << "Hello world!" << endl; 
    return 0; 
} 

以下は、endlを削除したコードです。

#include <iostream> 
#include <cstring> 

using namespace std; 
int main() 
{ 
    char * name; 
    char * n = "aaaa"; 
    strcpy(name, n); 
    cout << name; 
    cout << "Hello world!"; 
    return 0; 
} 
+3

代わりに絵 – Garf365

+0

へのリンクを与えることのあなたのポスト内側に、コピー/貼り付けエラーメッセージがたぶん[ 'strcpy'参照](HTTPをお読みください:
は、代わりのような何かを.com/w/c/string/byte/strcpy)? – juanchopanza

答えて

8

これらの行を見てみましょう:

char * name; 
char * n = "aaaa"; 
strcpy(name, n); 

変数nameが初期化されていません。その内容は不確定であり、一見ランダムです。 strcpyコールの宛先として使用すると、の未定義の動作になります。

char name[128]; 

しかし、あなたが実際にC++でプログラミングしている場合は、なぜドン:あなたはCスタイルの文字列を使用したい場合は

は、あなたは、配列を使用することにより、たとえば、nameためのメモリを割り当てる必要があります標準ライブラリに付属のすばらしいクラスを使用していませんか?たとえば、文字列を扱うときに非常に優れたstd::stringクラス:

#include <string> 
#include <iostream> 

int main() 
{ 
    std::string name; 
    std::string n = "aaaa"; 

    name = n; 

    std::cout << name << '\n'; 
    std::cout << "Hello world" << std::endl; 
} 
0

あなたはガベージアドレスにコピーしています。

char * name; //<<<garbage address 
char * n = "aaaa"; 
strcpy(name, n); 
2

nameは、初期化されていないポインタです。ランダムなメモリ位置を指します。 strcpyに接続すると、その場所で5バイトをトランプルして、aaaa\0に置き換えます。

正式には、これは未定義の動作です。実際には、2つの異なる症状が見られました。明らかな効果はなく、クラッシュです。

ポイントname実際に所有する十分大きなバッファであり、すべて正常です。

1


この 'name'行は初期化されておらず、ゴミを含んでいます。 //en.cppreference:

using namespace std; 
int main(){ 

    char name[10]; 
    char *n = "aaaa"; 
    strcpy(name, n); 
    cout << name; 
    cout << "Hello world!"; 

    return 0; 
} 
関連する問題