首页 > 解决方案 > 为什么 C 中的 struct 即使在内存分配较少的情况下也能正常工作?

问题描述

C 中的 Malloc 函数分配传递给它的参数的内存大小(以字节为单位)。这里我的结构变量有两个整数值。所以结构的大小应该是 8 个字节。我只分配 1 个字节,它仍在工作。

为什么?

C (海合会)

#include <stdio.h>
#include <stdlib.h>
struct node{
    int a;
    int b;
}ab; 
int main(){

    struct node * nl=(struct node *)malloc(1); //I am allocating memory here
    nl->b=89;
    nl->a=45;
    printf("%d %d %ld",nl->a,nl->b,sizeof(int));
}

在线尝试!

标签: cstruct

解决方案


当您写入超过分配内存的末尾时,您会调用undefined behavior,这意味着您无法可靠地预测程序将做什么。它可能会崩溃,它可能会输出奇怪的结果,或者(在这种情况下)它看起来可以正常工作。

printf通过进行看似无关的更改,例如添加未使用的局部变量或添加对调试的调用,可以改变未定义行为的表现方式。它也可以通过使用不同的优化设置或不同的编译器进行编译来改变。

程序可能会崩溃并不意味着它崩溃。


推荐阅读