C指针工作(但不是我预期的)

eb8*_*b80 1 c pointers

我正在阅读斯坦福大学的Essential C文档(PDF)和第20页,其中列出了以下代码:

int* p
*p = 13; // NO NO NO p does not point to an int yet
         // this just overwrites a random area in memory
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义.

据我所知,我们为第一行的整数指定空间,所以为什么我们不能在第二行立即指向一个整数(例如13)的值.

请详细解释(图表非常有用)正在发生的事情以及失败的原因.

pax*_*blo 12

int *p;
*p = 13;
Run Code Online (Sandbox Code Playgroud)

这意味着:

  • 创建一个p可以指向任何地方的单位指针.
  • 尝试在该位置存储13个.

图形:

+---+                      +---+
| p | --> points to ?????? |   |
+---+                      +---+
                             ^
                             |
  13 goes into here ---------+
Run Code Online (Sandbox Code Playgroud)

因为p未初始化,尝试使用它存储值是未定义的行为.

未初始化的行为相当令人讨厌(我更低调的断言之一).

可能完美无缺.它似乎工作但腐败的东西.它可能会使您的代码崩溃.它可能会影响您的代码,从而在三天后出现问题.它可能会使您的CPU陷入赤裸裸的奇点,带走您和您的家人.

它可能涉及鼻子恶魔和/或空中猪的生产:-)

底线是你不应该这样做.


从您的问题来看,您似乎认为*p = 13;可以p指出价值13.事实并非如此,特别是因为文字13实际上并不可寻址.执行此操作的代码将类似于:

int xyzzy = 13;     // xyzzy IS addressible,
int *p = &xyzzy;    // so make p point at it.
Run Code Online (Sandbox Code Playgroud)

再次,图形化:

                          xyzzy
+---+                     +----+
| p | --> points to xyzzy | 13 |
+---+                     +----+
Run Code Online (Sandbox Code Playgroud)

那将设置p为指向整数xyzzy,其中包含13.