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

C语言中如何初始化二维指针数组使其与另一数组指向相同指针?

问题分析与解决方案

核心错误拆解

1. 关于 *upper_nodes = *cols; 的错误

  • upper_nodes 是未初始化的 struct Node ** 变量,初始值是随机垃圾地址。直接解引用 *upper_nodes 相当于往随机内存地址写数据,必然触发段错误(操作系统拦截非法内存访问)。
  • 即便侥幸没触发错误,这行代码也只复制了 cols[0] 的值(第一个Node的指针)到随机位置,完全没处理 cols[1] 到 cols[N_RESTRICTIONS-1],所以后续元素是随机值是必然结果。

2. 关于 struct Node **upper_nodes = cols; 的错误

  • 这行代码是让 upper_nodes 这个二级指针变量,直接指向 cols 所指向的同一块指针数组内存。upper_nodes 和 cols 是两个不同的变量(地址自然不同),但它们存储的地址值完全一致,指向同一段calloc分配的内存。因此修改 upper_nodes[i] 本质就是修改 cols[i],完全不符合你“cols保持不变”的需求。

正确实现方式

你需要的是创建独立的指针数组:初始时每个元素和cols对应元素指向同一个Node,但数组本身是独立内存块,修改upper_nodes的元素不会影响cols。具体步骤:

  1. 给upper_nodes分配与cols相同大小的内存:
    struct Node **upper_nodes = calloc(N_RESTRICTIONS, sizeof(struct Node *));
    // calloc会自动把所有元素初始化为NULL,用malloc的话需手动处理初始化
    
  2. 遍历复制cols的每个指针元素:
    for (int i = 0; i < N_RESTRICTIONS; i++) {
        upper_nodes[i] = cols[i];
    }
    

这样实现后:

  • upper_nodes和cols是两个独立的指针数组,修改 upper_nodes[i] = new_node; 只会改变upper_nodes数组内的指针,不会影响cols的元素。
  • 初始时 upper_nodes[i] 和 cols[i] 指向同一个Node结构体,如果后续修改Node的内容(比如 upper_nodes[i]->value = 10;),cols[i]指向的Node内容也会同步变化——若需要连Node内容都完全独立,就得对每个Node做深拷贝,但从你的需求描述看,浅拷贝指针数组就足够。

指针层级补充说明

梳理清楚三层结构:

  • cols 是 struct Node ** 类型:它是一个指针,指向struct Node *类型的数组(即指针数组)。
  • cols[i] 是 struct Node * 类型:它是一个指针,指向具体的struct Node结构体实例。
    你要的是:新的upper_nodes作为另一个struct Node **,指向独立的指针数组,数组内的元素与原数组元素指向相同的Node。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:00:19