You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将结构体指针初始化为NULL后修改其成员是否属于未定义行为(UB)?

结构体指针初始化为NULL后修改成员的未定义行为分析

核心结论

将初始化为NULL的结构体指针用来访问或修改成员,属于明确的未定义行为(UB)。

你的代码示例

#include <stdio.h>
typedef struct aStructure {
    int testInt;
}aStructure;

int main(void) {
    aStructure * a=NULL;
    a->testInt = 123;
    printf("%d", a->testInt);
}

你遇到的现象及底层原因

  • 无警告/错误:默认编译选项下,多数编译器不会主动检查空指针解引用的问题。如果开启更高等级的警告(比如GCC的-Wall -Wnull-dereference),就能得到明确的警告提示。
  • 程序运行数秒后停止:NULL指针指向的是系统保留的无效内存地址(通常是地址0),当你执行a->testInt = 123时,本质是尝试往这个无效地址写入数据,触发了操作系统的内存保护机制,系统直接终止了你的程序进程。
  • 无任何输出:程序在执行printf语句之前就已经被系统终止,printf根本没有机会执行,因此不会产生任何输出。

关于内存分配的疑问

仅初始化结构体指针为NULL时,C语言不会为结构体本身分配任何内存空间。指针只是一个存储内存地址的变量,NULL表示它没有指向任何有效的内存块。你能写出a->testInt = 123只是语法上符合C语言规则,但这是非法的内存操作——编译器不负责在运行时检查指针的有效性,这类错误需要开发者自己规避。

内容的提问来源于stack exchange,提问作者user394334

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:22:07