前几天做课设的时候写了两个测试函数,发现了很奇怪的问题。通过最近查阅资料,总结了问题的所在。
- 第一次测试代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *fanhui()
{
char name1[300]="李四/student.txt";
char *p = name1;
return p;
}
char *ame()
{
char n[300] = "/student";
char *q = n;
return q;
}
int main()
{
char *name;
char *name2;
name = ame();
printf("name = %s\n",name);
name2 = fanhui();
printf("name2 = %s\n",name2);
return 0;
}
通过测试数据,我们可以看出都是同样的自定义函数,都是返回同类型的指针,可是第一个指针返回时候出现错误了,而第二个指针却能够正常将自定义函数里面的东西正常返回。其实按照理论是返回不了的,在自定义函数中定义的指针变量在该函数结束的时候应该已经被释放了。这个在自定义函数里面的指针变量应该被释放了才对,而且通过此处的释放,它不是将内存中的东西销毁,而是放弃了对这块内存的使用权,它的内容是在的,只是没有指针来指向它了。也正是因为如此,在后面的代码中可能就会占用该内存空间。name 首先获得ame( )函数的返回指针,而之后有函数的使用,则将该块区域占用了,所以name输出不了正常的内容,而第二个name1获得了fanhui( )函数的返回指针,之后没有其他函数调用程序来占用那块空间,所以将原来那块内容中的东西输出了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *fanhui()
{
char name1[300]="李四/student.txt";
//char *p = "李四/student.txt";
char *p = name1;
return p;
}
char *ame()
{
char n[300] = "/student";
//char *q = "/student.txt";
char *q = n;
return q;
}
int main()
{
char *name;
char *name2;
/* name = ame();
printf("name = %s\n",name);*/
/*此处将调用顺序换了,name将正常输出*/
name2 = fanhui();
printf("name2 = %s\n",name2);
name = ame();
printf("name = %s\n",name);
return 0;
}
该两个程序的比较可以发现,调用的顺序不同,输出的东西就不一样,说明在两个自定义函数中,两个数组中的内容并没有被销毁,只是那个区域的使用权限被销毁了,所以后面的代码可以随意占用这个区域,导致它不能输出该输出的内容。对于刚刚接触C语言,单写一个函数的时候,它都能正常返回自己想要的东西,所以就产生了错觉,感觉指针是销毁了,但是那个内容的地址已经被传给主函数里面的变量了,但是这个操作存在很大的隐患。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *fanhui()
{
char name[100]="正常输出!\n";
char *p = name;
return p;
}
int main()
{
char *q= fanhui();
printf("q = %s\n",q);
return 0;
}
所以通过上面这个函数就感觉之中操作是正确的。后来经过第一个代码对比,这个操作是错的。
使用及时可能会得到我们想要输出的数据,但是在特别多的代码里面,后面的程序可能会将前面的内存中的东西覆盖。这个是存在数组里的情况,若用指针的话情况感觉大同小异,只是使用了字符串常量,字符串常量是没有放在栈里面的,应该是不占据存储空间,存在指令中。所以自定义函数结束后,字符串常量的内容是存在的。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *fanhui()
{
//char name1[300]="李四/student.txt";
char *p = "李四/student.txt";
// char p = name1;
return p;
}
char *ame()
{
// char n[300] = "/student";
char *q = "/student.txt";
// char *q = n;
return q;
}
int main()
{
char *name;
char *name2;
/* name = ame();
printf("name = %s\n",name);*/
name2 = fanhui();
printf("name2 = %s\n",name2);
name = ame();
printf("name = %s\n",name);
return 0;
}
在自定义函数中利用指针和字符常量感觉应该没有什么问题了,但是此时的指针指向了字符串常量的首地址。若在指针地址返回的过程中调用了其他函数还是会造成输出不了理想的值,盗用一个网上的截图,其中n是得不到理想返回值的