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。具体步骤:
- 给upper_nodes分配与cols相同大小的内存:
struct Node **upper_nodes = calloc(N_RESTRICTIONS, sizeof(struct Node *)); // calloc会自动把所有元素初始化为NULL,用malloc的话需手动处理初始化 - 遍历复制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
相关产品推荐
相关产品推荐

