C中与结构和指针相关的问题

3

#include <stdio.h>
#include <stdlib.h>

struct Node{
  int data;
  struct Node* link;
};
struct Node* A;
int main(){
  struct Node* temp = (struct Node*)malloc(sizeof(Node));
  temp->data = 2;
  temp->link = NULL;
  A = temp; // in this line i have doubt
  return 0;
}

疑惑在于:A 和 temp 都是指向节点的指针。A = temp 可能有两种含义:
  1. 我们将 temp 的地址复制给了 A,因此 A 将指向同一地址。(即它们是相同的标识符/变量)
  2. 我们将 temp 的元素复制并赋值给了 A 的元素。(即它们是分开的标识符/变量)。通常在结构中使用这种方法。
所以请帮我理解它。

你没有为 temp 分配任何内存。而且 temp->data = NULL 应该改为 temp->link = NULL - Barmar
temp是一个指针,而不是一个结构体,所以temp->data = 2;是无效的——你正在分配未被分配的内存。你需要声明"Node temp;"来在堆栈上分配它,或者使用new()分配一个实例。相关链接:https://dev59.com/IWox5IYBdhLWcg3wJxL4 - Corbell
如果您为temp或A分配了内存,或者将它们分配给某个变量的地址,则它们都指向同一个地址。 - ValeriF21
@Barmar,是的,但我在问其他问题,请查看说明。我知道主题不清楚,但我无法在主题中解决这个疑问。 - uditkumar01
@Corbell是的,你的意思是我需要使用malloc为它分配内存。是的,那是我犯的错误之一,但我还想问另外一件事,请阅读描述以了解我的问题。顺便说一下,谢谢。 - uditkumar01
请不要将问题标记为C和C++,它们是不同的编程语言,会产生不同的答案。 - Alan Birtles
2个回答

1

赋值指针只是复制地址,而不是指针所指向的内容。因此,A = temp; 使得 Atemp 指向相同的地址。

如果您想复制元素,则必须解除指针引用:*A = *temp;


OP的代码存在足够多的未定义行为,忽略它会产生误导。在C++中,从技术上讲,在上面的代码中,*A = *temp 不会复制任何内容,因为(a) 上述程序的行为已经是不确定的,(b) 没有一行代码 *A = *temp 的行为是确定的。虽然正确表述这个问题很有挑战性,但除非你这样做,否则我认为这个答案是错误的并且对提问者有害。 - Yakk - Adam Nevraumont
请查看以下链接:https://dev59.com/f2445IYBdhLWcg3wTIjm。在这个问题中,他们使用了A=temp来复制元素。 - uditkumar01
因为那是一个结构体变量,而不是指针。 - Barmar

1

首先,你如何在这里将Null分配给temp->data = NULL;,这里的数据是int类型。

你的第一种选择是正确的。

你只是声明了结构指针变量,但没有初始化。

你的代码有一些错误,我已经修复了。运行下面的代码,在A=temp;语句之后查看A和temp具有相同的地址,这意味着两者都指向同一件事情。

#include <stdio.h>
#include <stdlib.h>

struct Node{
   int data;
   struct Node* link;
};  // you had forgot ';' here
struct Node* A;
int main(){
   struct Node *temp;
   temp=(struct Node*)malloc(sizeof(struct Node));  
   // this allocates memory and assign its address into temp structure pointer
   temp->data = 2;  
   temp->link = NULL; // here you was doing mistake
   A = temp; // in this line i have doubt
   printf(" Address of pointer A %p", A);
   printf("\n Address of pointer temp is %p",temp);

 return 0;
}

如果您还有疑问,请告诉我。


是的,我写成了temp->data而不是temp->link。非常抱歉。 - uditkumar01
请检查代码片段,如果有任何疑问或您的答案仍然不清楚,请询问。 - Ankit Mishra
谢谢,我的疑惑即将消除。如果我声明一个新的结构体,比如(temp1 = (struct Node*)malloc(sizeof(struct Node));),现在如果我执行temp1 = temp,那么这意味着什么,是将temp的地址赋值给temp1还是复制元素? - uditkumar01
从技术上讲,指针保存了它所指向的对象的地址。但是printf文本是误导性的。A是一个指针,有一个地址。术语“指针A的地址”应该是&A - harper
你的意思是如果我们不为指向节点的指针分配内存(例如A=temp的情况),那么它将存储该temp的地址。但是,如果我们为其分配内存(例如temp1=temp的情况),它将复制元素,因为内存已经分配给它。 - uditkumar01
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接