c语言中函数指针的好处,在C语言中实现函数多种方法的优缺点

场景:C语言中有个库函数stat,该函数是显示文件的相关信息(类似于ls -l显示出的相关信息),

成功则返回0,错误返回-1,其函数的语法格式为:int stat(const char *filename,struct fstat

*st)

方法一:标准库函数stat的语法

struct fstat *st

int i

char filename[1000]

st1=malloc(sizeof(struct fstat));

int stat(const char *filename,struct fstat *st);

i=stat(filename,st1);

方法二:

int i

char filename[1000]

struct fstat st

int stat(const char *filename,struct fstat

st); i=stat(filename,st);

方法三:

int i

char filename[1000]

struct fstat st

struct fstat stat(const char

*filename); st=stat(filename);

方法四:

int i

char filename[1000]

struct fstat st

struct fstat *stat(const char *filename);

&st=stat(filename);

方法五:

int i

char filename[1000]

struct fstat st

struct fstat *stat(const char

*filename); t

{ struct fstat *st1;

st1=malloc(sizeof(struct fstat));

return st1;

}

方法六:

int i

char filename[1000]

struct fstat *st

struct fstat *stat(const char

*filename); f

{ struct fstat st1;

return &st1;

}

st=stat(filename);

在其上5种方法中其正确的写法是:方法一,方法三,方法五

方法二错误的原因是:

理解形参与实参变量名相同,但其申请的内存单元不是同一块,而函数体申请的内存单元在函数执行完将释放

int stat(const char *filename,struct fstat

st)在该函数定义中它把文件名的相关信息放在结构体struct fstat st

的各成员中,但函数执行结束释放了,即函数外的变量struct fstat

st并未存放了filename的信息,不理解我们可以做个实验:

如:

#

main

{

int a,b;

a=5;

b=4;

compare(int a,int b)

{

int t;

t=a;

a=b;

b=t;

}

compare(a,b);

printf("a=%d,b=%d",a,b);

}

这个例子中形参与实参变量都是a,b,在函数compare中a,b的值被置换了,但printf打印a,b的值还是5,4

方法四错误的原因是:

&st=stat(filename)变量的内存单元只能被读,不能被改其地址,如:int b;int

*p;p=&a(读a内存单元的地址放到p的内存单元中)

方法六错误的原因是:

与方法二一样虽然函数返回了st1的地址但函数结束该st1内存释放了

方法一:它是在函数外使用了malloc库函数为st1结构体变量申请了内存单元,没有free(st1)该变量将一直占用内存直至程序结束

方法三:它的缺点在于调用函数stat后它是将函数内的整个结构体的内存单元内容复制给了st1,而方法一返回int类型只复制了4个

字节的内存单元给i变量(int 类型占4个字节,struct stat

st1占的内存单元是其各成员类型单元的总和);在使用前得先

给结构体变量初始化,要不然函数stat不成功也无法知道st1中的值是不是stat函数的返回值。

方法五:优点在于它是使用malloc函数申请内存单元,即便函数调用结束若没有free也将一直存在,但在函数体外需要free,否则

内存泄露,但若函数stat与main函数不在同一个文件其可读性不好。

总结:1.指针使用前需先申请内存单元,但变量不需要

2.形参与实参同不但其内存单元不一样

3.函数内相关的变量在调用时申请内存,结束即释放

4.内存单元的地址只读不可写

5.在变量前写const这该内存单元的内容只能被读

6.结构体类型的申请的内存单元是其各成员类型占用字节的总和

7.malloc申请的内存单元在使用结束一定要释放,否则内存泄露

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值