关于,函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致 问题分析
来源:互联网 发布:淘宝付款收不到验证码 编辑:程序博客网 时间: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
- 关于,函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致 问题分析
- 函数调用下形参和实参的内存分配
- 关于调用函数的实参问题
- 关于C和C++中函数调用时的形参和实参
- C++中内存分配、函数调用和返回值问题
- C++中内存分配、函数调用和返回值问题
- C++中内存分配、函数调用和返回值问题
- C++中内存分配、函数调用和返回值问题
- C++中内存分配、函数调用和返回值问题
- 关于函数调用过程中的实参和形参问题
- 函数调用中实参和形参变化问题
- 函数调用中实参和形参变化问题
- 函数调用和栈的内存分配过程分析
- 函数调用,形参实参的变化
- C语言中函数调用、实参、形参的选择
- C++中内存分配、函数调用和返回值
- 调用函数,有关形参和实参的易错问题。
- day06 函数 形参实参 函数的嵌套调用
- 大数据与信息社会的意义结构【转自阿里巴巴研究院】
- Redis内存使用优化与存储
- 如何让ipad 启动时默认横屏
- c++对象切割(Object Slicing)
- 如何成为一个编程高手
- 关于,函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致 问题分析
- Memcache - 分布式算法
- makefile详解 条件判断 二十
- Android 多线程之 Handler、Looper、Message 在基于 HTTP 系统中的应用
- poj 3299
- makefile详解 函数 字符串 文件名 二十一
- 对程序员的十条忠告&一些有趣的编程名言
- makefile详解 函数 foreach if call origin shell 控制make函数 二十二
- makefile详解 make 的运行 二十三