-1

なぜこれが機能するのか誰もが知っています:

int main(void)
{
char action;
int *i;
*i=10;
printf("%d",*i);
action='C';
printf("%c",action);
}

しかし、これはしません

int main(void)
{
char action='C';
int *i;
*i=10;
printf("%d",*i);
printf("%c",action);
}

エラーは発生しませんが、実行されません。その小さな違いがクラッシュする理由がわかりません

4

3 に答える 3

4

コードの動作は未定義です。その動作にはロジックはありません。それは本質的にランダムです。無関係な「わずかな違い」が実験で観察した行動を変える理由を分析しようとするのは時間の無駄です。

于 2012-12-10T18:17:11.797 に答える
2

他の回答で示されているように、両方のプログラムは等しく間違っています。

それを正しくするための多くの方法。これが2つの方法です。

  1. int *i;
    int j;
    i = &j;
    *i = 10;
    
  2. int * i = malloc(sizeof(int));
    *i = 10;
    
    // After you are done with i
    
    free(i);
    
于 2012-12-10T18:29:37.763 に答える
1

ですundefined bahavior。ポインタを作成しましたが、ポインタを初期化せずに、ポインタが指す10メモリ位置に値を直接配置しています。この場合、値はそのガベージ値の場所(ポインタの値i)に配置されます。したがって、ガベージ値の場所にアクセスできる場合は実行される可能性があり、メモリの場所にアクセスできない場合はクラッシュする可能性があります。iindeterminate value10i

したがって、それはただundefined bahavior

于 2012-12-10T18:19:55.880 に答える