关于,函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致 问题分析

来源:互联网 发布:淘宝付款收不到验证码 编辑:程序博客网 时间:2024/05/01 04:42

今天遇到一个问题:

#define true 1#define false 0#define ok 1#define error 0#define infeasible -1#define overflow -2#include<stdio.h>#include<malloc.h>typedef char ElemType;typedef int Status;typedef struct LNode{    ElemType data;    struct LNode * next;} LNode,*LinkList;void CreateList_HeadInsert(LinkList L)//头插法{    //建立带表头结点的单链表线性表L.    LinkList p;    char ch;    ch=getchar();    while(ch!='\n')    {        p=(LinkList)malloc(sizeof(LNode));        p->data=ch;        p->next=L->next;//插入第一个结点的时候L->next为null;        L->next=p;        ch=getchar();    }}void InitList(LinkList L)//初始化,创建头结点;{    L=(LinkList)malloc(sizeof(LNode));//头指针指向刚分配的地址;    L->next=NULL;//创建一个带头结点的单链表;}void main(){    LinkList L;    InitList(L);//初始化单链表;    CreateList_HeadInsert(L);//头插法建单链表    // p=L->next;    while(L->next!=NULL)    {        printf("%c",L->next->data);        L=L->next;    }}

函数执行到creat函数,L->next=p;时,发生段错误。怎么修改也没找到错误原因;

后看到回复:函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致,也就是main函数中的L->next没有被设置为NULL.去掉内存分配后,实参的next和形参的next指向同一位置,形参的next的变化同时导致实参的next的变化.

恍然大悟:在initlist初始化函数中,把指针L作为形参传到函数中的只是指针L的值,在函数中只能调用,但是不能修改。

malloc申请内存,即修改了指针的值,指向了别处,对指针L操作不在起左右,以后要避免这样的错误;

修改函数如下:

#include<stdio.h>#include<malloc.h>#include <string.h>#include <stdlib.h>#define true 1#define false 0#define ok 1#define error 0#define infeasible -1#define overflow -2typedef char ElemType;typedef int Status;typedef struct LNode{    ElemType data;    struct LNode * next;} LNode,*LinkList;LinkList head;  //定义头指针void CreateList_HeadInsert(LinkList L)//头插法{    //建立带表头结点的单链表线性表L.    LinkList p;    char ch;    ch=getchar();    while(ch!='\n')    {        p=(LinkList)malloc(sizeof(LNode));        p->data=ch;       //p->next=L->next;//插入第一个结点的时候L->next为null;        p->next = NULL;        L->next=p;        L = p;        getchar();//注意,此处添加getchar()吸收回车符;        ch=getchar();    }}/* *函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致void InitList(LinkList L)//初始化,创建头结点;{    L=(LinkList)malloc(sizeof(LNode));//头指针指向刚分配的地址;    L->next=NULL;//创建一个带头结点的单链表;}*/void main(){    LinkList L;    L=(LinkList)malloc(sizeof(LNode));//头指针指向刚分配的地址;    L->next=NULL;//创建一个带头结点的单链表;    head = L;    // InitList(L);//初始化单链表;    CreateList_HeadInsert(L);//头插法建单链表    // p=L->next;    while(L->next!=NULL)    {        printf("%c",L->next->data);        L=L->next;    }    putchar('\n');}

执行:

[root@bogon home]# ./t5qwertqwert


原创粉丝点击