【问题标题】:changing struct/variable content in C更改 C 中的结构/变量内容
【发布时间】:2012-02-07 16:27:26
【问题描述】:

我想就以下问题获得一些帮助。 我有一个结构节点,我想用某种方法改变它的内部。 我想在我的 main 方法中打印更改后的结构的内容。 如何在不将节点作为返回值返回的情况下更改结构并在我的 main 中查看更改的值。 我想它可以通过将结构节点作为指针传递然后对其进行编辑来解决。 这样做的正确方法是什么?

例如:

typedef struct Node{
   struct Node * right;
   struct Node * left;
   void * data;
}Node;

void insert(void * element, Node* root){
   if(root==NULL){
       root=(Node*)malloc(sizeof(Node));
       root->data=element;
   }
}


int main(){
    Node a;
    int b=8;
    insert(&b,&a);
    printf("%d",*(int*)a.data);
    return 0;   
}

printf 不打印 8 它打印 1(我猜是一些垃圾)

【问题讨论】:

  • 如果这是家庭作业,请标记它。是的,指针是实现这一目标的方法。

标签: c malloc parameter-passing


【解决方案1】:

听起来您正在尝试执行以下操作

  • 用一种方法创建一个结构,比如 main
  • 将其传递给第二种方法,例如示例
  • 让示例修改结构并使结果在 main 中可见

如果是这样,那么在 C 中执行此操作的方法是将 struct 作为指向 example 的指针传递。

struct Node {
  int data;
  struct Node* pNext;
};

void example(struct Node* pNode) {
  pNode->data = 42;
  pNode->pNext = NULL;
}

int main() {
  struct Node n;
  example(&n);
  printf("%d\n", n.data);
}

编辑

回复更新的问题。

要查看修改Node 的结果,您必须传递Node*。因此,要查看Node* 修改的结果,您需要传递Node**。本质上,您需要传递比您想要变异/返回的值多一级的间接性。

void insert(void* element, Node** ppRoot){
  if (NULL == *ppRoot) {
    Node* pTemp = malloc(sizeof(Node));
    pTemp->data = element;
    *ppRoot = pTemp;
  }
}

【讨论】:

  • 当我按照你说的去做时,它会正确显示,但是如果我想像我一样使用 malloc 分配内存怎么办。为什么它不起作用呢?
  • @mary C 中的一切都是按值传递的原因。本质上,本地的副本被传递给函数。因此,使用单个指针,您只需将内存分配给从main 看不到的副本。使用双指针虽然您传递了双指针的副本,但它仍然指向与 main 中的值相同的指针。因此,当您更改指向的值时,这两种方法都可见
  • 我还有一个问题。如果我使用 if(root==NULL) 是改变 root 为空这一事实的唯一方法是通过分配一些内存给它?
  • 答案是救命稻草。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多