c - 分配未初始化的 void* 指针

标签 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;
} 

这实际上编译和执行没有错误,你甚至可以 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/

相关文章:

c++ - 跨平台微秒级精准时间戳

c - 如何在另一个结构体中初始化一个结构体的数组?

c - Lua:getglobal内部回调

android - __android_log_print 输出 '/n' 换行 CR

android - 如何修复找不到 libgcc.a : No such file or directory error

在 C/glib 中将 guint8 转换为 uint32_t

c - GLIBC:调试内存泄漏:如何解释 mtrace() 的输出

C90 printf with\n or\r\n 在 cygwin 中不工作;但是 fflush(标准输出);工作正常。为什么?

c++ - 无法链接到 SQLite3 静态库

c++ - 自定义构建环境/目标库