0

私は C を学んでいて、型キャストとメモリ割り当てを理解しようとしていました。

私は小さなコードを書き、それが失敗すると思った。

#include <stdio.h>
#include <stdlib.h>
struct A {
    int x;
    int y;
};    
int main()
{
    int *i;
    float *f;
    struct A *ptr;
    i = (int *)malloc(4);
    if(i==NULL) {
        printf("\n failed to allocate memory \n");
        return 1;
    }
    *i=10;
    printf(" %d \n",*i);
    f = (float *)i;
    *f = 10.2;
    printf(" %f \n",*f);
    ptr = (struct A *)f;
    ptr->x=10;
    ptr->y=20;
    printf(" %hd \n",ptr->x);
    printf(" %hd \n",ptr->y);
}

4 バイトのメモリを割り当て、float (4 バイト) と 8 バイトの構造体を指す同じポインターを型キャストしたため、このコードは失敗すると予想していました。私はそれがセグフォールトを与えると思っていましたが、問題なく値を出力しました。

私が欠けているものはありますか?

4

2 に答える 2

2

これは未定義の動作と呼ばれます。ptrメモリ内と同じ場所を指しているfloatので、一緒に上書きしていてint、割り当てられたメモリの後に 4 バイトを使用しています。あなたが運が良かったから失敗したのではありません。

于 2013-03-23T17:48:05.770 に答える
1

おそらく、プログラムのデータ セグメントに割り当てられたメモリ領域にまだ書き込みを行っているため、セグメンテーション フォールトは発生しません。どのデータを上書きしているのか、これが後でどのような影響を与えるのかを判断するのは困難です。プログラムは非常に短いため、特定の状況下ではまったく影響がない場合があります。大規模なプログラムは、しばらく実行した後におそらくクラッシュします (「遅延クラッシュ」)。

これが中級言語のCです。この安全性が必要な場合は、代わりに高級言語を使用してください。これらの不足はありません。

于 2013-03-23T21:28:51.817 に答える