假设我们有以下内容:
int main(void) {
char* ptr;
printf("%c\n",ptr[24]); // junk value
ptr[24] = 'H';
printf("%c\n", ptr[24]); // prints H
return 0;
}
当我将垃圾值更改为其他内容时,这是否意味着我正在破坏内存,或者这个值是字面上的垃圾,所以我分配给它的新值无关紧要?
答案 0 :(得分:6)
你的程序展示了未定义的行为,这意味着:字面上任何事情都可能发生,并且它仍然被标准所涵盖为不应许。当我说什么时,我的意思是它的全部。它甚至可以使您的计算机变得有感染并在街上追逐你。
嗯,通常会发生什么,但这是不合理的,是你写入未映射的地址空间(在带有分页内存的现代操作系统上)导致分段错误或总线错误(取决于架构,操作系统和运行时实现) )。
ptr
是一个单位化指针,这意味着尚未定义指针的值。根据定义,未定义的指针指向任何东西和所有东西,即根本没有有效对象。使该指针有效的唯一方法是为其指定一个指针取消引用的类型的正确C对象的地址。
答案 1 :(得分:5)
您正在访问调用未定义行为的无效内存位置。任何事情都可能发生,无法预测。
答案 2 :(得分:2)
由于大多数C实现允许您访问无效的内存位置,因此实际上是将'H'
值分配给该位置。
但是你不能相信接下来会发生什么。也许您的程序失败,可能会损坏其他程序使用的内存,或者在多线程环境中,另一个程序可能会覆盖该值。