是指针的指针,还是指针做参数

来源:互联网 发布:左程云算法视频百度云 编辑:程序博客网 时间: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


原创粉丝点击