我正在阅读斯坦福大学的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可以指向任何地方的单位指针.图形:
+---+ +---+
| 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.