2016-03-24 17 views
-2

C言語の学習を始めたばかりです。私はC#とJavaで良い歴史を持っています。C:整数変数がランダムに値を変更する

#include <stdio.h>  
#include <stdlib.h> 
#include "info.h" 
int main() 
{ 
    int day = 24, month = 3, year = 2016; 

    char name[] = "Ahmad\0"; 
    strcpy(name, "Ahmad(strcpy-ed string)\0"); // <-- LINE 8 

    printf("%s made this program on %d-%d-%d\n", name, day, month, year); 

    return 0; 
} 

ご覧のとおり、値は日、月、年に割り当てられています。しかし、問題は、出力が競争力のある異なる値を持つことです。出力はこれです

Ahmad(strcpy-ed string) made this program on 1920234272-1684352377-1885565556 

さらに面白いのは、私が8行目を削除しても正しく動作することです。なぜこうなった?

+0

コンテナの容量を超えるものをコピーすると、大問題が発生します。 – user3528438

+0

これはオーバフローです... 'Ahmad \ 0'(6位配列)、' 'Ahmad(strcpy-ed string)\ 0" '(6以上、カウントするのが怠惰です) – Bonatti

+0

私はstrcpy()がメモリを再割り当てすると思った.... –

答えて

1

あなたは割り当てられているよりも多くのバイトを名前[]にコピーしています.Cはこれをやめることを止めません。余分なバイトは他のものを上書きします。この場合、あなたの他の変数です。定義されていない動作を作成していますが、これはCプログラムでは非常に悪いことです。

0

nameには8文字の場所しかありません。他のメモリにはおそらく他の変数が書き込まれます。

関連する問題