#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;
}

这实际上编译和执行没有错误,您甚至可以fwrite*(int*)ptr内容,您将得到0x4A424F4B但是,删除此行时:
FILE *wtf = fopen("wat", "wb");

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

最佳答案

从技术上讲,您的代码有undefined behaviour
它不会在使用特定编译器的特定平台上爆炸,因为未初始化的ptr碰巧包含某些可写内存的地址因为我们不知道ptr指的是什么,所以我们不知道作业有什么危害。
四处移动会改变地址,并且会“中断”(严格地说,它们一开始并没有真正工作)。

关于c - 分配未初始化的void *指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25236616/

10-12 12:43
查看更多