声明int**类型双指针后是否存在可直接访问的底层单指针?
问题解答
我们直接针对你的疑问分场景给出明确结论:
- 仅声明
int** ptr但未做任何初始化/赋值时:不存在合法的底层单指针,禁止直接访问*ptr - 已为
ptr分配/指向合法的int*类型内存空间时:无需单独声明int*类型变量,可直接访问对应的底层单指针
详细说明
1. 仅声明未初始化的场景
当你只写int** ptr;(局部变量)时,仅在栈上申请了一块存储双指针的内存空间,该变量的值是随机野值,指向任意未知内存地址。此时不存在任何当前程序可合法访问的、用于存储int*类型数据的内存块,自然不存在可用的底层单指针。此时强制访问*ptr属于未定义行为,绝大多数场景会触发段错误。
2. 已为ptr分配合法指向的场景
你所说的“单独创建单指针”本质是显式声明一个int*类型的变量,这和是否存在合法的int*类型内存空间是完全独立的两个概念。你完全可以不声明任何int*变量,直接为ptr申请一块能存储int*的内存,该内存块就是你所说的“底层单指针”,可以直接访问,参考如下合法代码:
#include <stdlib.h> int main(void) { int** ptr; // 直接为双指针分配内存,申请到的空间就是存储int*的内存,即底层单指针 ptr = malloc(sizeof(int*)); // 无需单独声明int*变量,直接操作*ptr(底层单指针)赋值 *ptr = malloc(sizeof(int)); // 操作最终的int类型值 **ptr = 42; // 内存释放 free(*ptr); free(ptr); return 0; }
上述代码全程没有显式声明任何int*类型变量,所有操作均符合C语言标准。*ptr访问的就是底层的int*类型内存,它不需要对应一个显式声明的int*变量才能使用。
误区澄清
很多开发者容易混淆“指针变量”和“指针类型的内存空间”:指针本质是内存地址,只要内存地址属于当前程序的合法可访问范围,不管对应的内存来自栈上显式声明的变量,还是堆上malloc申请的空间,都可以正常访问,不需要对应一个具名的变量。
内容的提问来源于stack exchange,提问作者Robert Hamm
相关产品推荐
相关产品推荐

