我可以像这样更改struct对象中的值吗?

时间:2011-10-09 01:46:35

标签: c

我不知道如何传递指向函数的指针并更改指向指针的值

我是这样做的:

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

struct node{
    struct node* lchild;
    struct node* rchild;
    struct node* p;
    int noChild;
    char* data;
    int height;
};

typedef struct node text_t;

text_t * create_text(){
    text_t * txt = NULL;
    return txt;
}

int length_text(text_t *txt){
    if(txt == NULL)return 0;
    return txt->noChild+1;
}

char * get_line(text_t * txt, int index){
     if(index>txt->noChild+1) return NULL;

     text_t * current = txt;
     while((current->noChild+1)!=index-1){
        if(index-1>current->noChild+1){
           current = current->rchild;
           }else{
             current = current->lchild;
             }                                                     
     }
     return current->data;
}

void append_line(text_t *txt, char * new_line){     
      text_t * temp;

      if (txt == NULL){

       txt = (text_t *)malloc(sizeof(text_t));
       txt->lchild = NULL;
       txt->rchild = NULL;
       txt->noChild = 0;
       txt->p = NULL;
       txt->data = new_line;
       txt->height = 1;
       printf(txt->data);
     }else{
       text_t * current = txt;

       while(current->rchild!=NULL){
       current = current->rchild;
       }

       temp = (text_t *)malloc(sizeof(text_t));
       temp->lchild = NULL;
       temp->rchild = NULL;
       temp->noChild = 0;
       temp->data = new_line;
       temp->height = 1;
       temp->p = current;

}}    







int main()
{  int i, tmp; text_t *txt1, *txt2; char *c;
   printf("starting \n");
   txt1 = create_text();//1
   txt2 = create_text();

   append_line(txt1, "line one" );//2
 ...

我想在C中创建这样一个结构的对象,并用它来构建一个平衡的树。

然而,在我做了append_line()后,txt1没有任何变化,它仍然是NULL。 为什么呢?

由于

3 个答案:

答案 0 :(得分:2)

这是因为c 按值传递

 void append_line(text_t *txt, char * new_line){ 
   // ....

   txt = (text_t *)malloc(sizeof(text_t));

   // .....
 }

 int main() {
   // ...
   append_line(txt1, "line one" );
   // ...
 }
main中的

txt1不会受到txt的appen_line中的malloc语句的影响。如果要影响main中的txt1,请将函数text_t参数更改为指向指针。

void append_line(text_t **txt, char * new_line);

现在从main传递txt1的地址 -

append_line(&txt1, "line one" );

答案 1 :(得分:0)

在C中,函数参数按值传递。这意味着您在函数外部看不到对函数中的参数所做的任何更改。通过传递指向要修改的数据的指针来解决这个问题。这会更改参数指向函数外部可见的数据,但由于指针本身是按值传递的,因此对它的任何更改都将不可见。为了使该更改可见,您需要一个指向指针的指针。

void append_line(text_t **txt, char * new_line){     
  if (*txt == NULL){
    *txt = (text_t *)malloc(sizeof(text_t));
    *txt->lchild = NULL;
    ...

// in main
text_t *txt1 = create_text();//1
append_line(&txt1, "line one" );//2

或者,您可以从txt函数返回append_line的新值。

text_t* append_line(text_t *txt, char * new_line){     
  if (txt == NULL){
    txt = (text_t *)malloc(sizeof(text_t));
    txt->lchild = NULL;
    ...

  return txt;
}

// in main
text_t *txt1 = create_text();//1
txt1 = append_line(txt1, "line one" );//2

答案 2 :(得分:0)

txt1是指向node的指针。将指针视为传递给append_line的数字地址。 txt的{​​{1}}参数接收append_line的数字地址。如果您要修改txt1内的成员,那么您将修改txt指向的内容。但是,当您在txt1中为txt分配新值时,您将覆盖驻留在append_line变量中的数字地址。这对txt完全没有影响 - 相反,它会使txt1指向新值。

如果要为指针指定新值,则必须将指针传递给它。换句话说,您需要将指针传递给指针。请考虑以下版本:

txt