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
相关产品推荐
相关产品推荐

