将垃圾值初始化为C中的某个值时会发生什么?

use*_*392 6 c memory pointers

假设我们有以下内容:

int main(void) {
   char* ptr;

   printf("%c\n",ptr[24]);  // junk value

   ptr[24] = 'H';

   printf("%c\n", ptr[24]);  // prints H

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我将垃圾值更改为其他内容时,这是否意味着我正在破坏内存,或者这个值是字面上的垃圾,所以我分配给它的新值无关紧要?

dat*_*olf 6

你的程序表现出不明确的行为,这意味着:字面上任何事情都可能发生,并且它仍然被标准覆盖为不应该.当我说什么时,我的意思是它的全部.它甚至可以使您的计算机变得有感情并在街上追逐你.

嗯,通常会发生什么,但这是不合理的,是你写入未映射的地址空间(在具有分页内存的现代操作系统上)导致分段错误或总线错误(取决于架构,操作系统和运行时实现).

ptr是一个单位化指针,这意味着指针的值尚未定义.根据定义,未定义的指针指向任何东西和所有东西,即根本没有有效对象.使该指针有效的唯一方法是为其指定指针取消引用的类型的正确C对象的地址.

顺便说一句:普通C有非常非常严格的打字规则.我有时会说它比C++更严格,因为它缺少隐式转换运算符和函数重载.但其粗糙的铸造和糟糕的编译器破坏了其在类型安全方面的声誉.


Nav*_*een 5

您正在访问调用未定义行为的无效内存位置.任何事情都可能发生,无法预测.