#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/