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