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

今天遇到一个问题:

#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 -2
typedef 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]# ./t5
q
w
e
r
t

qwert


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章