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

标签 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

这对我来说没有意义。

据我了解,我们在第一行为指向整数的指针分配空间,那么为什么我们不能在第二行立即指向整数值(例如 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/

相关文章:

c - 指针未设置为结构数组的元素

c - C 中的 Typedef 和结构

C多维数组堆赋值

c - 如何通过将数字添加到数组 'name' (即存储第一个元素地址的常量指针)来访问数组的元素?

c - 将指针的地址分配给指针到指针

c - 在 C Win32 中使用 hBitmap = CreateDIBSection() 保存 .bmp 文件

c - C 中分母的增量

c - 返回指向结构数组的指针

c - 使用函数获取指向链表最后一个节点的指针

go - 我如何获取数组元素的地址,该数组元素是结构的元素,该结构是指针