gpt4 book ai didi

C 指针工作(但不像我预期的那样)

转载 作者:太空宇宙 更新时间:2023-11-04 00:12:36 24 4
gpt4 key购买 nike

我正在阅读斯坦福的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com