我正在阅读斯坦福的 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
这对我来说没有意义。
据我了解,我们在第一行为指向整数的指针分配空间,那么为什么我们不能在第二行立即指向整数值(例如 13)。
请详细解释(图表非常有用)发生了什么以及失败的原因。
最佳答案
int *p;
*p = 13;
这意味着:
- 创建一个可以指向任何地方的单元化指针
p
。 - 尝试在该位置存储 13 个。
以图形方式:
+---+ +---+
| p | --> points to ?????? | |
+---+ +---+
^
|
13 goes into here ---------+
因为 p
未初始化,所以尝试使用它存储值是未定义的行为。
未初始化的行为相当烦人(我比较低调的断言之一)。
它可能工作得很好。它可能看起来有效但会破坏某些东西。它可能会使您的代码崩溃。它可能会影响您的代码,从现在起三天后出现问题。它可能会使您的 CPU 崩溃为裸奇点,并带走您和您的家人。
它可能涉及鼻恶魔和/或空中 pig 的生产:-)
底线是你不应该这样做。
从您的问题来看,您似乎认为 *p = 13;
使 p
指向值 13
。事实并非如此,尤其是因为文字 13
实际上不可寻址。执行此操作的代码类似于:
int xyzzy = 13; // xyzzy IS addressible,
int *p = &xyzzy; // so make p point at it.
再次,以图形方式:
xyzzy
+---+ +----+
| p | --> points to xyzzy | 13 |
+---+ +----+
这会将 p
设置为指向包含 13 的整数 xyzzy
。
关于C 指针工作(但不像我预期的那样),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23238675/