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

这被称为未定义行为。你让ptr指向与内存中的float相同的位置,所以你和int一起覆盖它,你占用了分配内存后的4个字节。失败不是因为你运气好。

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

这是C, 中级语言。如果您需要这种安全性,请使用高级语言代替,它们并不缺乏。

相关内容

  • 没有找到相关文章

最新更新