是指针的指针,还是指针做参数
来源:互联网 发布:左程云算法视频百度云 编辑:程序博客网 时间:2024/06/05 11:05
先看下面这段代码,判断head1->str以及head2->str的值
#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct Node{char* str;struct Node *next;}LNode;void createList_1(LNode *head){head=(LNode*)malloc(sizeof(LNode));(head->str)=(char*)malloc(50);strcpy(head->str,"hello,i am a freshman1!");head->next=NULL;}void createList_2(LNode **head){(*head)=(LNode *)malloc(8);(*head)->str=(char*)malloc(50);strcpy((*head)->str,"hello,i am a freshman2!");(*head)->next=NULL;}void main(){LNode *head1,*head2;createList_1(head1);createList_2(&head2);}
通过调试后,发现其实head1是一个野指针,而head2->str的值为hello,i am a freshman2!
原因是什么呢?
就是因为传入参数的不同导致,一个传入的是指针,一个传入的是指针的指针,这就是pass by value 和pass by reference的区别了
Main函数中定义的head1和head2
Head1 0x0018FF44
Cc cc cc cc
Head2 0x0018FF40
Cc cc cc cc
Main函数调用了createList_1,传入的参数为head1,将把cccccccc赋给形参head,在createList_1函数的栈帧中,将为形参head分配一个4字节地址0x0018FEF0,其指向的正是main函数head1指向的地址cccccccc
通过malloc后,其值指向了一个堆地址0x00583860,这个堆上的空间大小为8字节,其中4个字节为指针char* str ,4个字节为next指针。
通过对str malloc后,char*str指向了堆上的0x005838A8,
Head 0x0018FEF0--à
0x00583860à
0x005838A8(hello,I am a freshman1!)
0x00583864à
00 00 00 00 (NULL)
当返回到main函数后,createList_1的栈帧要销毁,也发现head1还是指向的是cccccccc
所以这样为LNode *head分配动态内存是错误的,createList_1只是为其形参head分配了一个动态空间
Main函数调用 createList_2后,在createList_2中,传入的是head2的地址0x0018FF40,在执行createList_2时,通过反应用*head后,其值为cccccccc。。然后接下来的都和createList_1一样,最后的结果就是使*head的值从cccccccc变化为:0x00583920,&(*head)的就是head2的地址0x0018FF40
最后的结果Head1 0x0018FF44
Cc cc cc cc
Head2 0x0018FF40
0x00583920
- 是指针的指针,还是指针做参数
- 函数指针,指针函数,指针的指针做函数参数
- C语言之指针专题二:指针做函数参数是指针存在的最大意义
- C语言之指针专题二:指针做函数参数是指针存在的最大意义
- 指针以及指针做参数的问题
- 函数的参数是指针
- 指针的指针还是指针的引用
- C++指针做函数参数传递的是指针的值!
- 指针参数--指针做参数时应该注意的地方
- 指针引用作参数和指针做参数的区别????
- 指针做函数参数
- 使用指针做参数
- 函数指针做参数
- 指针数组做参数
- 指针变量做参数
- 指针做函数参数
- 函数指针做参数
- 指向指针的指针做函数的参数
- 【性能优化】 之 几种常见的等待事件的演示示例
- (哈夫曼树10.3.1)POJ 3253 Fence Repair(计算带权路径长度最小的哈夫曼树)
- 黑马程序员——Java 多线程
- jQuery ajax 请求 和 Submit 提交 form 表单
- android笔记整理
- 是指针的指针,还是指针做参数
- Velocity语法
- 浏览器的标准模式和怪异模式
- Oracle 修改SGA后启动不了 且没有备份 ORA-27102: out of memory
- android二级listview列表
- [Python] modify *.c -> *.java script
- 【玩转cocos2d-x之十六】滚动字幕和公告
- java基础
- 移植apache2 ARM版 - 交叉编译pcre-8.33