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 个字节的内存并类型转换了相同的指针以指向浮点数(4 个字节)和具有 8 个字节的结构。我虽然它给出了段错误,但它打印出没有任何问题的值。

有什么我想念的吗。

4

2 回答 2

2

这称为未定义行为。您ptr指向与内存中相同的位置float,因此您将其与 the 一起覆盖,int并且在分配的内存之后占用了 4 个字节。它没有失败,因为你很幸运。

于 2013-03-23T17:48:05.770 回答
1

您可能仍在写入为程序的数据段分配的一些内存区域,因此不会发生分段错误。很难说你覆盖了哪些数据,以及这将在以后产生什么影响。由于程序很短,在某些特定情况下可能根本没有任何影响。较大的程序很可能会在运行一段时间后崩溃(“延迟崩溃”)。

这是C,中级语言。如果您需要这种安全性,请改用高级语言,不乏这些。

于 2013-03-23T21:28:51.817 回答