分配uninitilialized void*指针

m13*_*132 1 c gcc glibc

#include <stdio.h>

void wat(void *ptr){
    *(int*)ptr = 0x4A424F4B;
    return;
}

int main(int argc, char **argv){
    FILE *wtf = fopen("wat", "wb");
    void *ptr;
    wat(ptr);
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

这实际上编译并没有错误执行,你甚至可以fwrite的内容*(int*)ptr,你会得到0x4A424F4B.但是,当您删除此行时:

FILE *wtf = fopen("wat", "wb");
Run Code Online (Sandbox Code Playgroud)

*(int*)ptr = 0x4A424F4B;会突然导致分段错误.为什么?

NPE*_*NPE 6

从技术上讲,您的代码具有未定义的行为.

碰巧不会使用您的特定编译器在您的特定平台上爆炸,因为未初始化ptr恰好包含某些可写内存的地址.由于我们不知道ptr指向哪里,我们无法知道任务的影响.

移动的东西改变了地址,事情"破裂"(严格来说,它们并不是真正起作用).