我不知道如何传递指向函数的指针并更改指向指针的值
我是这样做的:
#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。 为什么呢?
由于
答案 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