如何初始化二维指针数组以指向与另一个给定指针相同的指针

问题描述 投票:0回答:2

我是 C 语言新手,试图通过编写真实的代码来学习它,而不是孤立和幼稚的书本示例。我在正确理解指针方面遇到了很多困难。我的书并没有真正的帮助。

我有一个指针数组,我正在按以下方式初始化它:

struct Node **cols;
cols = (struct Node *) calloc(N_RESTRICTIONS, sizeof(struct Node *));
// for loop malloc-ing each cols[0..N_RESTRICTIONS] here

这看起来不错。我需要另一个变量,比如 upper_nodes,它最初指向与 cols 相同的节点,但随着算法的发展,它会发生变化,而 cols 不会改变。我试过:

struct Node **upper_nodes;
*upper_nodes = *cols;

我期望的是:upper_nodes地址与col的不同(它们是不同的变量),但是由于每个地址中的第一个指向值由于分配而相同,所以我现在可以索引upper_nodes[i]就像我对 cols 所做的那样,并重新分配它而不影响 cols[i] 指向的内容。

这不是正在发生的事情,我遇到了分段错误,在调试器中我看到两个变量中的第一个值都指向同一个项目,但之后 upper_nodes 具有随机值(例如未初始化,我确信这就是发生的事情,但我不明白)。

我没有得到什么?有什么方法可以做到这一点?

额外问题:我看到上面最后一段代码的作用与:

struct Node **upper_nodes = cols;

这个我也不明白。我现在期望 upper_nodes 和 cols 具有相同的地址,但它们没有,这似乎表明我什至不理解变量是如何工作的。

c pointers segmentation-fault
2个回答
1
投票

正如评论中提到的,

*upper_nodes = *cols
只复制一个指针,而不是整个数组。

你可以用循环来做:

for (int i = 0; i < N_RESTRICTIONS; I++) {
    upper_nodes[i] = cols[i];
}

或者您可以使用

memcpy()
一次性复制它们:

memcpy(upper_nodes, cols, N_RESTRICTIONS * sizeof *cols);

1
投票

指针正如其名称所暗示的那样:它们是一个指向另一个事物的事物。

如果你把它全部画在纸上,就会变得非常清楚:

+------+ +------------+ +------------+------------+--- --+
|列 | --> |列[0] | --> |列[0][0] |列[0][1] | ... |
+------+ +---------+ +------------+------------+---- -+
             |列[1] |
             +---------+
             | 。 |
             | 。 |
             | 。 |
             +---------+

那么当你说你

期望

upper_nodes
cols
有相同的地址

如果您的意思是您期望

&upper_nodes
等于
&cols
那么这是不正确的。拉出来看起来像:

+--------------+ +-------------+
| &upper_nodes | --> |上节点 | --\
+--------------+ +-------------+ | +---------+-----+
                                        >--> |列[0] | ... |
+--------+ +------+ | +---------+-----+
| &cols | --> |列 | ----------------/
+--------+ +------+

所以

&upper_nodes
指向变量
upper_nodes
。并且
&cols
指向变量
cols

并且

upper_nodes
cols
都指向
cols[0]

所以

&upper_nodes != &cols
,但是
upper_nodes == cols

请注意,上图假设

upper_nodes
的原始声明为
struct Node **

© www.soinside.com 2019 - 2024. All rights reserved.