Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
键入指针并为其分配比malloc'更多的内存;d不会抛出任何错误_C_Casting_Malloc - Fatal编程技术网

键入指针并为其分配比malloc'更多的内存;d不会抛出任何错误

键入指针并为其分配比malloc'更多的内存;d不会抛出任何错误,c,casting,malloc,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

我正在学习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);
}
#包括
#包括
结构A{
int x;
int-y;
};    
int main()
{
int*i;
浮动*f;
结构A*ptr;
i=(int*)malloc(4);
如果(i==NULL){
printf(“\n未能分配内存\n”);
返回1;
}
*i=10;
printf(“%d\n”,*i);
f=(浮动*)i;
*f=10.2;
printf(“%f\n”,*f);
ptr=(结构A*)f;
ptr->x=10;
ptr->y=20;
printf(“%hd\n”,ptr->x);
printf(“%hd\n”,ptr->y);
}
我预计这段代码会失败,因为我只分配了4个字节的内存,并将相同的指针类型转换为指向float(4个字节)和具有8个字节的结构。我认为它给出seg故障,但它打印出的值没有任何问题


是否有我遗漏的东西。

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

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

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


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

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


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

重复:“我希望此代码失败”-不要害怕,它确实失败了,只是没有以可见的方式。叹气。所有编译器都需要一个“-enableRuntimeTestsRunDefinedBehavior”开关,该开关在默认情况下处于打开状态,直到您找到一个代码将其关闭,并且该代码将被禁止在搜索引擎中使用,并且仅在编程语言教科书中发布。或者,可能只有通过编程测试后,才能作为各种授权机构发布的加密签名使用。虽然这有点相关,但它不是一个非常直接的副本。特别是,另一个问题不是处理
malloc()
.duplicate:“我预期这段代码会失败”-不要害怕,它确实失败了,只是没有以可见的方式。叹气。所有编译器都需要一个“-enableRuntimeTestsRunDefinedBehavior”开关,该开关在默认情况下处于打开状态,直到您找到一个代码将其关闭,并且该代码将被禁止在搜索引擎中使用,并且仅在编程语言教科书中发布。或者,可能只有通过编程测试后,才能作为各种授权机构发布的加密签名使用。虽然这有点相关,但它不是一个非常直接的副本。特别是,另一个问题不是处理
malloc()
。从调试器的角度来看,我必须同意:D从调试器的角度来看,我必须同意:D