我正在学习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,但它打印出的值没有任何问题。
我有什么遗漏。
答案 0 :(得分:2)
这称为未定义的行为。您将ptr
指向与内存中float
相同的位置,因此您需要将其与int
一起覆盖并重新占用分配内存后的4个字节。它并没有因为你的幸运而失败。
答案 1 :(得分:1)
您可能仍在写入为程序的数据段分配的某些内存区域,因此不会发生分段错误。很难说你覆盖了哪些数据,以及后来会产生哪些影响。由于该计划很短,在某些特定情况下可能根本没有任何影响。运行一段时间后,较大的程序很可能会崩溃(“延迟崩溃”)。
这是C,中级语言。如果您需要这种安全性,请使用高级语言,而不是缺少这些。