对指针进行类型转换并为其分配比malloc更多的内存并不会引发任何错误

时间:2013-03-23 17:45:09

标签: c casting malloc

我正在学习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个字节的结构。我虽然它给出了seg-fault,但它打印出的值没有任何问题。

我有什么遗漏。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

这是C,中级语言。如果您需要这种安全性,请使用高级语言,而不是缺少这些。