免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9271 | 回复: 61
打印 上一主题 下一主题

局部变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-30 13:54 |只看该作者 |倒序浏览
#include <stdio.h>
int f1(int val)
{
        int *ptr;

        if( val == 0) {
                int vall;
                vall = 5;
                ptr = &vall;
        }
        //printf("vall:%d\n",vall);
        printf("%d\n",*ptr);

        return (*ptr + 1);
}
int main(void)
{
        int a = 0;
        int rtn;
        rtn = f1(a);
        printf("rtn:%d\n",rtn);
}
这是一段基于<<Advanced Programming in the UNIX Environment>>的代码,请问有问题吗?
我这里是可以正确执行,但是书中却说有问题。说在return之前变量vall已经不存在了。

论坛徽章:
0
2 [报告]
发表于 2007-07-30 13:59 |只看该作者
局部变量在函数结束后就被干掉了 你的val是局部变量

论坛徽章:
0
3 [报告]
发表于 2007-07-30 14:00 |只看该作者
执行对,并不表示下次你还能对。即便你重复一万次,都是对的,也不表示下一次也能得到预期的结果。

论坛徽章:
0
4 [报告]
发表于 2007-07-30 14:08 |只看该作者
原帖由 fcloudf 于 2007-7-30 13:59 发表
局部变量在函数结束后就被干掉了 你的val是局部变量



应该不是这个局部变量的问题吧.
你说的这种情况是说在函数中分配了一段内存,然后在函数返回之后再去访问这段内存从而出错的情况.
但是楼主这种是直接从return就返回了一个整数回来了.而不是返回的一个指针啊.
平时都是这种return value;的方式啊.

论坛徽章:
0
5 [报告]
发表于 2007-07-30 14:18 |只看该作者
问题 就在于return了一个局部变量的指针。这个是不被允许的。

论坛徽章:
0
6 [报告]
发表于 2007-07-30 14:23 |只看该作者
五楼没长眼睛!同意四楼的说法,但我要进一步强调一下,如果val != 0, 那么指针 ptr 就没被初始化, 那么return 时返回(*ptr + 1)根本就不可能,这不是局部变量问题,而是指针有可能未初始化的问题!

[ 本帖最后由 linux_ha 于 2007-7-30 14:24 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-07-30 14:24 |只看该作者
看来我没有说清楚,
由于vall(不是val)变量是在if{}条件之后分配内存的,当if{}之后,其空间被回收了,按照道理,此时的ptr指向的地址(即变量vall的地址)中的值(为5)已经被回收了,但是程序运行的结果是还可以得到此值。

论坛徽章:
0
8 [报告]
发表于 2007-07-30 14:25 |只看该作者
倒,这哪是局部变量的指针问题啊??????

论坛徽章:
0
9 [报告]
发表于 2007-07-30 14:30 |只看该作者
看来这里有的人的水平真不怎么着啊....或者是没看仔细...

论坛徽章:
0
10 [报告]
发表于 2007-07-30 14:32 |只看该作者
原帖由 linux_ha 于 2007-7-30 14:23 发表
五楼没长眼睛!同意四楼的说法,但我要进一步强调一下,如果val != 0, 那么指针 ptr 就没被初始化, 那么return 时返回(*ptr + 1)根本就不可能,这不是局部变量问题,而是指针有可能未初始化的问题!

haha,你的意思

  1. #include <stdio.h>
  2. int f1(int val)
  3. {
  4.         int *ptr;

  5.        {
  6.                 int val;
  7.                 val = 5;
  8.                 ptr = &val;
  9.         }
  10.   
  11.         return (*ptr + 1);
  12. }
复制代码


这样就是合法的? 初始化了吧,合法了??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP