You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在此场景下使用void**会导致段错误?

代码段错误的原因解析

你的代码核心问题出在类型强制转换的语义不匹配,导致非法内存访问:

  1. 先看指针类型:&array的实际类型是int (*)[2](指向包含2个int的数组的指针),但你强行把它转换成了void**(指向void*的指针)。这两种指针的用途完全不同,void**是用来存储指针地址的,而数组的起始地址存储的是int类型的数据。
  2. 当执行ptr[0]时,相当于从ptr指向的地址(也就是数组的起始地址)读取一个void*大小的值——数组第一个元素是1,所以这里等于把整数1当成了一个内存地址。
  3. 最后*(int*)ptr[0]尝试去访问地址为0x1的内存,这个地址属于系统保护的内存区域,普通程序没有权限读写,直接触发段错误。

如果要实现你期望的打印array[0]的效果,正确的写法可以是:

int array[] = {1, 2};
int* ptr = array; // 数组名本身就是指向第一个元素的指针
printf("%d", *ptr);

或者用void指针中转的写法:

int array[] = {1, 2};
void* ptr = array;
printf("%d", *(int*)ptr);

内容的提问来源于stack exchange,提问作者Rye Bread

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 01:33:10