这是一个输入数字来显示相应月份的简单程序,但有一地方我感到不理解:
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);
}

解决方案 »

  1.   

    MonthName()函数的返回值就是字符串啊!你认为char * 是什么???
      

  2.   

    可能是吧
    但是str仅是一个指针,他指向某个地址,而这个地址是在局部变量里定义的啊。
    是不是在对这个地址的引用消失之前,内存都不释放啊?
      

  3.   

    to华弟:  我认为返回的是某一个字符串的首地址,但由于该字符串申明在局部变量中所以在main()函数中是无法根据首地址进行读取,因为该字符串所占的字符块已释放掉,继续关注!!!!
      

  4.   

    可能是这样的
    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];
    }
      

  5.   

    你定义的是个指针数组,数组中每一个成员都是个字符串指针,也就是一个地址,这指针指向一个字符串常量,这个常量并不是局部变量,所以函数执行结束并不受到影响。虽然Name数组本身不再有效,但是它指向的字符串常量仍然有效,所以程序运行结果是正确的!
      

  6.   

    你的name数组是局部变量,但是你返回的是局部变量的指针啊!改为
    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"};或者申明为全局变量即可!
      

  7.   

    1.你返回的是一个局部变量指针,很显然, 这是一个很糟的做法. (请看 
      Effective C++  )   
    2.同时,你申明了一个局部变量,类型为指针.即然你给它分配了空间就必须自己释放它.而你没有,所以造成了内存泄露.
      

  8.   

    我刚才去图书馆查了一下相关的资料,应该是这样的:
    我写的这段程序没错,因为字符串常量可作为字符串的首地址返回,in other words,虽然我们返回的是字符串首地址,但根据它就可得出对应的字符串常量。 另外,还需注意的是,当该局部变量是字符型数组是,这时在该变量声明前面应加上static关键词,这使得被调用函数执行完返回main()函数,该静态局部变量所占用的存储空间仍然还在,还可继续根据该存储空间的地址对其中的数据进行读取。  罗里罗嗦说了这么多,不知大家认同否?
      

  9.   

    局部变量是放在stack里的,在你的函数返回以后,那个stack虽然无效,但是他的内容仍然存在的!所以是能通过地址访问到的。
    要是你函数在返回的之后把stack中的内容改变了,那就。
      

  10.   

    我是这样认为的:
    MonthName函数在运行的时候,系统分配了空间,存储January","February","March","April","May","June","July","August","September","Ocotober","November","December
    当函数返回的时候,返回字符串首地址,将它赋给str,
    局部变量*Name[]释放的时候,只是将*Name[]释放,并没有把内存中的数据洗掉,这就类似文件被彻底删除只是把文件地址除掉,并没有把数据除掉,只要没有在原地址重新写入数据,仍然可以通过数据恢复软件把数据恢复