C 语言迷途指针17 Mar 2025 | 4 分钟阅读 与指针和内存管理相关的最常见的错误是悬空/野指针。有时程序员未能为指针初始化有效地址,那么这种未初始化的指针就被称为 C 语言中的悬空指针。 当对象被删除或从内存中释放而未修改指针的值时,在对象销毁时会出现悬空指针。在这种情况下,指针指向的内存已被释放。悬空指针可以指向包含程序代码或操作系统代码的内存。如果我们为此指针赋值,它将覆盖程序代码或操作系统指令的值;在这种情况下,程序将显示不期望的结果,甚至可能崩溃。如果内存被重新分配给另一个进程,那么解引用悬空指针将导致段错误。 让我们观察以下示例。 ![]() 在上面的图中,我们可以观察到指针 3 是一个悬空指针。指针 1 和指针 2 是指向已分配对象的指针,即对象 1 和对象 2。指针 3 是悬空指针,因为它指向已释放的对象。 让我们通过一些 C 程序来理解悬空指针。 使用 free() 函数释放内存。 在上面的代码中,我们创建了两个变量,即 *ptr 和 a,其中“ptr”是指针,“a”是整数变量。*ptr 是使用malloc()函数创建的指针变量。我们知道 malloc() 函数返回 void,所以我们使用 int * 将 void 指针转换为 int 指针。 语句int *ptr=(int *)malloc(sizeof(int)); 将分配 4 字节内存,如下面的图像所示 ![]() 语句free(ptr) 释放内存,如下图所示,其中有一个交叉符号,并且“ptr”指针由于指向已释放的内存而成为悬空指针。 ![]() 如果我们给“ptr”赋值 NULL,那么“ptr”将不再指向已删除的内存。因此,我们可以说 ptr 不是悬空指针,如下图所示 ![]() 变量超出作用域 当变量超出作用域时,指向该变量的指针将成为悬空指针。 在上面的代码中,我们执行了以下步骤
函数调用 现在,我们将看到当调用函数时指针如何成为悬空指针。 让我们通过一个例子来理解。 在上面的代码中,我们执行了以下步骤
输出 ![]() 让我们用图示表示上述代码的工作方式。 ![]() 让我们考虑另一个悬空指针的例子。 上面的代码与之前的代码类似,但唯一的区别是变量“y”是静态的。我们知道静态变量存储在全局内存中。 输出 ![]() 现在,我们用图示表示上述代码的工作方式。 ![]() 上面的图显示了堆栈内存。首先,调用fun()函数,然后控制转移到int *fun()的上下文。由于“y”是静态变量,所以它存储在全局内存中;它的作用域在整个程序中都可用。当返回地址值时,控制会返回到main()的上下文。指针“p”包含“y”的地址,即 100。当我们打印“*p”的值时,它会打印“y”的值,即 10。因此,我们可以说指针“p”不是悬空指针,因为它包含存储在全局内存中的变量的地址。 避免悬空指针错误 可以通过将指针初始化为NULL值来避免悬空指针错误。如果我们给指针赋值NULL值,那么指针将不再指向已释放的内存。将NULL值赋给指针意味着指针不指向任何内存位置。 |
sizeof() 运算符在 C 语言中常用。它以 char 大小存储单元的数量确定表达式或数据类型的大小。sizeof() 运算符包含一个操作数,可以是表达式或数据类型转换,其中...
7 分钟阅读
C 语言中的常量指针 在 C 语言编程中,常量指针是一种不能改变其指向变量地址的指针,这意味着地址将保持不变。因此,我们可以说,如果一个常量指针指向...
阅读 8 分钟
C 语言解引用指针 正如我们已经知道的“什么是指针”,指针是存储另一个变量地址的变量。解引用运算符也称为间接运算符,用 (*) 表示。当间接运算符 (*) 与...
阅读 3 分钟
什么是空指针? 空指针是指不指向任何内存位置的指针。它存储段的基地址。空指针基本上存储 Null 值,而 void 是指针的类型。空指针是...
5 分钟阅读
C 语言双指针(指向指针的指针) 在 C 语言编程中,双指针是用于存储另一个指针地址的指针。第一个指针用于存储变量的地址,第二个指针用于存储...
7 分钟阅读
C 语言中的指针算术 我们可以在指针上执行算术运算,例如加法、减法等。但是,正如我们所知,指针包含地址,如果另一个操作数是...
阅读 6 分钟
到目前为止,我们已经研究了分配给指针的地址应该与指针声明中指定的类型相同。例如,如果我们声明 int 指针,那么这个 int 指针不能指向 float 变量或某些其他类型...
阅读 4 分钟
在 C 语言中,函数指针是指包含函数地址的指针实例,因此函数可以作为参数使用并动态调用。它在回调函数、事件驱动程序和多态性等方法中很有用。正如我们所知,我们...
阅读 10 分钟
在 C 编程中,指针是用于存储另一个变量地址的变量。该变量可以是 int、char、数组、函数或任何其他指针类型。它使我们能够操作存储在特定... 的数据。
阅读 12 分钟
到目前为止,我们已经看到在 C 语言编程中,我们可以将变量作为参数传递给函数。我们不能将函数作为参数传递给另一个函数。但是我们可以通过使用...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India