为什么编译器可以正常使用?

Win*_*ail 3 c struct pointers

昨晚我花了一大笔时间来追踪我的应用程序中的段错误.最终,原来我写道:

ANNE_SPRITE_FRAME *desiredFrame;
*desiredFrame = anne_sprite_copy_frame(&sprite->current);
Run Code Online (Sandbox Code Playgroud)

代替:

ANNE_SPRITE_FRAME desiredFrame;
desiredFrame = anne_sprite_copy_frame(&sprite->current);
Run Code Online (Sandbox Code Playgroud)

在第1行中,我创建了一个类型化指针,在第2行中,我将取消引用指针的值设置为返回的结构anne_sprite_copy_frame().

为什么这是一个问题?为什么编译器会接受这个呢?我能想到的只是示例1中的问题是:

  1. 我为指针保留了空间,但没有为它指向的内容,或者
  2. (不太可能)它试图将返回值存储在指针本身的内存中

Ree*_*sey 5

在第1行中,我创建了一个类型化指针,在第2行中,我将取消引用指针的值设置为anne_sprite_copy_frame()返回的结构.

这两个都在C中允许,这就是编译器完全可以接受的原因.

编译器不会检查以确保您的指针实际指向任何有意义的东西 - 它只是取消引用和分配.

C的最好和最差的功能之一是编译器对你做的很少的理智检查 - 它遵循你的指示,并完全按照你的要求去做.你告诉它做两个合法的操作 - 即使变量没有正确初始化.因此,您会遇到运行时问题,而不是编译时问题.