C 内存未分配指针变量有效。怎样

C 内存未分配指针变量有效。怎样,c,C,我已经编写了这段代码&预计它会失败,因为我没有为指针变量分配内存。令我惊讶的是,它没有抛出任何错误。原因是什么 如果我,只是随机地,删除第二个LOC,它抛出了一个分段错误。如何解释这种看似奇怪的行为 uint16_t *c; uint8_t *d; *c = 1; printf("%x:%x",c,*c); 正如其他人所指出的那样,这是一个错误。您对代码“正常工作”的观察或多或少是随机的,即不会导致segfault或类似故障。堆栈上另一个变量的分配可能会更改,其中分配了c指针,因此它可以有

我已经编写了这段代码&预计它会失败,因为我没有为指针变量分配内存。令我惊讶的是,它没有抛出任何错误。原因是什么

如果我,只是随机地,删除第二个LOC,它抛出了一个分段错误。如何解释这种看似奇怪的行为

uint16_t *c; 
uint8_t *d;
*c = 1;
printf("%x:%x",c,*c); 

正如其他人所指出的那样,这是一个错误。您对代码“正常工作”的观察或多或少是随机的,即不会导致segfault或类似故障。堆栈上另一个变量的分配可能会更改,其中分配了c指针,因此它可以有一个不同的(随机)指向的位置。(或者,换言之,它的初始随机值将不同,也可能不同)


可观察到的程序的不同行为取决于函数中分配的对象的位置和内容(独立对象),这表明函数中的内存分配有问题。

该行为未定义。它“有效”只是它的副作用。你不应该依赖它,也不应该编写这样的代码。这并不奇怪,它是未定义的。我明白了,它是一种未定义的行为。感谢@usr,@/martin james
c
没有初始化,但是存储
c
的内存有一些值,这取决于程序之前执行的操作。例如,堆栈上的变量取决于之前(调用函数时)写入堆栈的内容。因此,您可能最终得到
c
,有时碰巧得到一个值,该值是指向您可以编写程序的内存位置的指针。但它也可能只是一个无效指针。你说的“仍然工作”是什么意思?它究竟做了什么,为什么你认为它工作?我无法想象这段代码的任何行为可以合理地用“它仍然有效”来描述。