假设我们有以下内容:
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)
当我将垃圾值更改为其他内容时,这是否意味着我正在破坏内存,或者这个值是字面上的垃圾,所以我分配给它的新值无关紧要?
你的程序表现出不明确的行为,这意味着:字面上任何事情都可能发生,并且它仍然被标准覆盖为不应该.当我说什么时,我的意思是它的全部.它甚至可以使您的计算机变得有感情并在街上追逐你.
嗯,通常会发生什么,但这是不合理的,是你写入未映射的地址空间(在具有分页内存的现代操作系统上)导致分段错误或总线错误(取决于架构,操作系统和运行时实现).
ptr是一个单位化指针,这意味着指针的值尚未定义.根据定义,未定义的指针指向任何东西和所有东西,即根本没有有效对象.使该指针有效的唯一方法是为其指定指针取消引用的类型的正确C对象的地址.
顺便说一句:普通C有非常非常严格的打字规则.我有时会说它比C++更严格,因为它缺少隐式转换运算符和函数重载.但其粗糙的铸造和糟糕的编译器破坏了其在类型安全方面的声誉.