这是一个输入数字来显示相应月份的简单程序,但有一地方我感到不理解:
char *Name[]是个局部变量,当MonthName()函数结束后,就应该释放掉。
虽然能返回一个地址,但我觉得不能根据该地址输出某个字符串
而执行结果是正确的。为什么?
char *MonthName(int n)
{
char *Name[]={"January","February","March","April","May",
"June","July","August","September","Ocotober","November","December"}; if(n<1||n>12)
{
printf("输入的整数n应在1到12之间\n");
exit(0);
}
return Name[n-1];
}
void main()
{
int m;
scanf("%d",&m); char *str;
str=MonthName(m); printf("%s\n",str);
}
char *Name[]是个局部变量,当MonthName()函数结束后,就应该释放掉。
虽然能返回一个地址,但我觉得不能根据该地址输出某个字符串
而执行结果是正确的。为什么?
char *MonthName(int n)
{
char *Name[]={"January","February","March","April","May",
"June","July","August","September","Ocotober","November","December"}; if(n<1||n>12)
{
printf("输入的整数n应在1到12之间\n");
exit(0);
}
return Name[n-1];
}
void main()
{
int m;
scanf("%d",&m); char *str;
str=MonthName(m); printf("%s\n",str);
}
解决方案 »
- WritePrivateProfileString 如果不转换成Cstring,是存储不进去还是存储的是乱码
- 注册表已添加键值,开机也自动启动了,但是sys.ini里面的设置没有成功加载,程序不可以用,退出后重新启动一切就正常,郁闷中
- 简单问题 关于对话框全平
- ::和:::
- 菜鸟请教工程建立问题
- 各位大侠们帮小弟看看这个程序把!!!很急啊!!
- UDP数据报包含12字节长的伪首部
- 人生不如意,散
- 怎样在两个时间段内查找记录
- 谁能帮帮我解决一下这个问题?谢谢
- 主窗口可以用dlg.DoModal() == IDOK判断是否在子窗口按下了OK按钮,如何判断我自己加的按钮事件?
- STL跌代器的迷惑,高手指点!
但是str仅是一个指针,他指向某个地址,而这个地址是在局部变量里定义的啊。
是不是在对这个地址的引用消失之前,内存都不释放啊?
1)在dos下,单任务,虽然函数退出了,但是堆栈中还保留着具体的数值,而且还没有被别的程序占用。
2)在windows下,程序被保护起来,跟dos下没什么差别我把你的程序改动了一下,共有两个部分,在linux下
1)main中加入了重新申请内存的,结果没变化,估计申请内存,在允许情况下,空余内存线性上涨使用
2)估计你的数组放在代码段中,这是我该的程序,我认为没有错误,结果就不一样了。char *MonthName(int n)
{
char *Name[]={"January","February","March","April","May",
"June","July","August","September","Ocotober","November","December"};
char name[12][30];
int i;memset( name, 12 * 30, 0 );
for( i = 0; i < 12; i++ )
strcat( name[ i ], Name[ i ] );if(n<1||n>12)
{
printf("输入的整数n应在1到12之间\n");
exit(0);
}return name[n-1];
}
static char *Name[]={"January\0","February\0","March\0","April\0","May\0",
"June\0","July\0","August\0","September\0","Ocotober\0","November\0","December\0"};或者申明为全局变量即可!
Effective C++ )
2.同时,你申明了一个局部变量,类型为指针.即然你给它分配了空间就必须自己释放它.而你没有,所以造成了内存泄露.
我写的这段程序没错,因为字符串常量可作为字符串的首地址返回,in other words,虽然我们返回的是字符串首地址,但根据它就可得出对应的字符串常量。 另外,还需注意的是,当该局部变量是字符型数组是,这时在该变量声明前面应加上static关键词,这使得被调用函数执行完返回main()函数,该静态局部变量所占用的存储空间仍然还在,还可继续根据该存储空间的地址对其中的数据进行读取。 罗里罗嗦说了这么多,不知大家认同否?
要是你函数在返回的之后把stack中的内容改变了,那就。
MonthName函数在运行的时候,系统分配了空间,存储January","February","March","April","May","June","July","August","September","Ocotober","November","December
当函数返回的时候,返回字符串首地址,将它赋给str,
局部变量*Name[]释放的时候,只是将*Name[]释放,并没有把内存中的数据洗掉,这就类似文件被彻底删除只是把文件地址除掉,并没有把数据除掉,只要没有在原地址重新写入数据,仍然可以通过数据恢复软件把数据恢复