场景: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申请的内存单元在使用结束一定要释放,否则内存泄露