鱼C论坛

 找回密码
 立即注册
查看: 4417|回复: 10

大家来找茬,代码中那个处地方写错了

[复制链接]
发表于 2012-9-15 18:39:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 liwang002 于 2012-9-15 20:40 编辑

#include <stdio.h>

void main()
{
        
        double *search();
        double *result;
        int i;        
        result = search();
        
        printf("%f\n",*(result + 0));
        printf("%f\n",*(result + 0));
        printf("%f\n",*(result + 2));
        printf("------------------\n");
        for (i = 0;i < 3 ;i++)
        {
                printf("%f\n",*(result + i));        
        }

}

double *search()
{
        double arr[10] = {60.8, 80.0, 30.0, 50.0, 22.0, 100.0, 50.9};
        return arr;
}



打印结果
60.800000
0.000000
1.#QNAN0
------------------
0.000000
0.000000
1.#QNAN0

60.8下面的结果怎么是0 和1,
世外高人,世外大牛,世外大仙,麻烦借用一下你们的闪亮亮,火眼晶晶的双眼,帮忙找找那个地方写错了,小弟在此拜谢了
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-9-15 19:58:56 | 显示全部楼层
本帖最后由 liwang002 于 2012-9-15 20:29 编辑

难道是我的编译器坏了吗? 我找出的答案是,只要执行printf函数,result指针值就变了汇编代码
10:       result = search();
0040EDD4   call        @ILT+0(_search) (00401005)
0040EDD9   mov         dword ptr [ebp-4],eax
11:
12:       i = *result;
0040EDDC   mov         ecx,dword ptr [ebp-4]
0040EDDF   mov         edx,dword ptr [ecx]
0040EDE1   mov         dword ptr [ebp-34h],edx
13:       printf("--------------------\n");
0040EDE4   push        offset string "--------------------\n" (00424000)
0040EDE9   call        printf (0040ed00)
0040EDEE   add         esp,4
这里把result的值改变了,有没有大牛能不能指点一下,我的代码那里写错了呀


小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-15 20:46:27 | 显示全部楼层
double *search()
{
         double arr[10] = {60.8, 80.0, 30.0, 50.0, 22.0, 100.0, 50.9};
         return arr;
}
你定义的search函数在运行完毕后,系统自动释放   此函数所用空间及所有包含的变量,所以search函数运行完毕,已把内存空间释放
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-9-15 20:54:47 | 显示全部楼层

那指针函数具体怎么使用才能保存 返回的指针不被释放呢?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-15 21:06:26 | 显示全部楼层
#include <stdio.h>
#include <stdio.h>
void main()
{
        
        double *search();
        double *result;
        int i;        
        result = search();
        
        printf("%f\n",*(result + 0));
        printf("%f\n",*(result + 0));
        printf("%f\n",*(result + 2));
        printf("------------------\n");
        for (i = 0;i < 3 ;i++)
        {
                printf("%f\n",*(result + i));        
        }
}
double *search()
{
       static double arr[10] = {60.8, 80.0, 30.0, 50.0, 22.0, 100.0, 50.9};
        return arr;
}


把 arr数组定义成静态变量就可以了
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-9-15 21:13:15 | 显示全部楼层
友来友网 发表于 2012-9-15 21:06
#include
#include
void main()

用完之后,如何释放static指针 ,arr这个数组的作用域范围是?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-15 21:21:17 | 显示全部楼层
liwang002 发表于 2012-9-15 20:54
那指针函数具体怎么使用才能保存 返回的指针不被释放呢?

可以动态分配内存
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-15 21:46:49 | 显示全部楼层
liwang002 发表于 2012-9-15 21:13
用完之后,如何释放static指针 ,arr这个数组的作用域范围是?

在整个程序结束后 arr数组才会被释放 如果不加static 加以修饰的话 arr数组就会在search 函数运行完后就会被释放
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-16 06:10:05 | 显示全部楼层
主要的问题应该已经被前面几楼给解决了,不错,也跟着学习了一下。不过这里:
        printf("%f\n",*(result + 0));
        printf("%f\n",*(result + 0));
        printf("%f\n",*(result + 2));
中间的一个应该是1吧。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-16 15:32:40 | 显示全部楼层
liwang002 发表于 2012-9-15 20:54
那指针函数具体怎么使用才能保存 返回的指针不被释放呢?

申请动态内存
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-17 03:02:00 | 显示全部楼层
用不用都行
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-15 03:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表