我已经编写了这段代码并预计它会失败,因为我没有为指针变量分配内存。令我惊讶的是,它没有抛出任何错误。原因是什么?
如果我只是随机删除第二个 LOC,它会引发分段错误。如何解释这种看似奇怪的行为?
uint16_t *c;
uint8_t *d;
*c = 1;
printf("%x:%x",c,*c);
正如其他人指出的那样,它是UB。您观察到的代码"工作"在不会导致段错误或类似错误或类似的情况下或多或少是随机的。您在堆栈上分配的另一个变量可能会更改 c 指针的分配位置,因此它可以具有指向的不同(随机)位置。(或者,换句话说,它的初始随机值会或可能不同)。
根据函数中分配的位置和对象(独立)对象,程序的可观察到的不同行为是一个致命的赠品,即函数中的内存分配有问题。