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

C语言结构体链表指针复制后修改是否影响原指针指向内容?

链表指针赋值后的修改影响解答

答案是肯定的,这个修改会影响li指向的item值,原因其实和C语言里指针的本质有关,我给你掰扯清楚:

首先看你的链表定义:

typedef struct ListNode* List;
struct ListNode {
    int item;
    List next;
};

当你把li复制给li1的时候,你复制的不是整个ListNode结构体,而是li这个指针变量里存储的内存地址——也就是那个item为1的节点在内存中的位置。这时候li和li1就像两把完全一样的钥匙,都能打开同一个房间(也就是同一个ListNode节点)。

所以当你执行li1->item = 2;的时候,你是通过li1这个指针找到了对应的内存区域,把里面的item值改成了2。而li指向的是同一块内存,当你再通过li访问item的时候,读到的自然就是修改后的2了。

举个代码例子更直观:

// 假设我们有个创建节点的函数
List createListNode(int val, List nextNode) {
    List newNode = malloc(sizeof(struct ListNode));
    newNode->item = val;
    newNode->next = nextNode;
    return newNode;
}

// 实际使用场景
List someList = ...; // 假设这是已有的链表
List li = createListNode(1, someList);
List li1 = li; // 复制指针

li1->item = 2;
printf("li->item = %d\n", li->item); // 这里会输出2,而不是初始的1

如果想让修改li1不影响li,你需要做深拷贝:也就是创建一个全新的ListNode节点,把原节点的item和next值都复制到新节点里,然后让li1指向这个新节点。比如:

List li1 = malloc(sizeof(struct ListNode));
li1->item = li->item;
li1->next = li->next;
// 这时候修改li1->item就和li没关系了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:15:20