首页 > 代码库 > 函数形参和实参问题
函数形参和实参问题
今天闲着没事实现了一下数据结构里面的顺序表,在顺表初始创建的时候遇到了这样一个问题。
#include<stdlib.h> #include<stdio.h> #define MaxSize 1000 #define ElemType int typedef struct { ElemType data[MaxSize]; int length; }SqList; int isListEmpty(SqList *L); int *p; void CreateList(SqList *LTMP,ElemType a[],int n){ printf("%p ",LTMP); LTMP=(SqList *)malloc(sizeof(SqList)); printf("%p ",LTMP); p=(int *)LTMP; printf("%p\n",p); for(int i=0;i<n;i++) (*LTMP).data[i]=a[i]; (*LTMP).length=n; } void dispList(SqList *L){ if(isListEmpty(L)) return; for(int i=0;i<L->length;i++){ printf("%d ",L->data[i]); } printf("\n"); } int isListEmpty(SqList *L){ return(L->length==0); } int main() { int a[3]={1,2,3}; SqList * L=NULL; printf("%p ",L); CreateList(L,a,3); printf("%d %d %d \n",*p,*(p+1),*(p+2)); printf("%p\n",L); //dispList(L); }
当你在CreateList(SqList *L,ElemType a[],int n)里,不对L加上&(引用符)将会导致dispList函数报错,原因是这里的CreateList函数里L传递的是形参,CreateList函数的L指针是一个临时指针,设为LTMP。哪怕是指针,没有引用符,传递的也是形参,L是两个指针。
第一个地址表示实参L的地址,因为L为NULL,所以地址为0地址。第二个地址为L的传递给CreateList函数的形式参数,LTMP一样指向NULL,同样为0地址。
第三个地址由于给LTMP分配了新的内存空间,指向malloc开辟的一段动态内存,首地址为000...00337000,第四个地址是全局变量指针P指向LTMP的地址,也为000...00337000。但是当函数运行结束后,调用函数栈为空,临时变量也被释放,那段内存一直没有被释放。
后面用*p,*(p+1),*(p+2)输出1,2,3,即在CreateList赋的值,那段内存一直没有释放了,里面存的数据也没有改变,如果没有内存只想它,就会出现内存泄露。
后面再输出L的地址,由于是值传递,所以L没有改变,依旧是0地址。
下面我们用 引用传递来看看。
#include<stdlib.h> #include<stdio.h> #define MaxSize 1000 #define ElemType int typedef struct { ElemType data[MaxSize]; int length; }SqList; int isListEmpty(SqList *L); int *p; void CreateList(SqList *&L,ElemType a[],int n){ printf("%p ",L); L=(SqList *)malloc(sizeof(SqList)); printf("%p ",L); p=(int *)L; printf("%p\n",p); for(int i=0;i<n;i++) L->data[i]=a[i]; L->length=n; } void dispList(SqList *L){ if(isListEmpty(L)) return; for(int i=0;i<L->length;i++){ printf("%d ",L->data[i]); } printf("\n"); } int isListEmpty(SqList *L){ return(L->length==0); } int main() { int a[3]={1,2,3}; SqList * L=NULL; printf("%p ",L); CreateList(L,a,3); printf("%d %d %d \n",*p,*(p+1),*(p+2)); printf("%p\n",L); dispList(L); }
第一二个地址都是L的地址,没有变化,所以依旧是0地址。后面用malloc函数传给动态分配内存的首地址,并且由于传递了L的实参,L发生了改变,所以三四五地址同为新分配的地址。dispList函数可以正常运行了。
函数形参和实参问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。