加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么这两个C程序不会产生相同的结果?

发布时间:2020-12-16 10:05:21 所属栏目:百科 来源:网络整理
导读:我首先编写了这个程序,它递归地计算pi并在误差值足够小时停止. #include stdio.h` #include stdlib.h #include math.hint threads=1;double error=0.000001;double func(double);struct args{ double l; double r; double fl; double fr; double area;};doub
我首先编写了这个程序,它递归地计算pi并在误差值足够小时停止.

#include <stdio.h>`
 #include <stdlib.h>
 #include <math.h>

int threads=1;
double error=0.000001;
double func(double);


struct args{
         double l;
         double r;
         double fl; 
         double fr; 
         double area;};

double quad(struct args*);

int main(int argc,char *argv[]) {

    struct args* res = (struct args*)malloc(sizeof(struct args));
    res->l=0;
    res->r=1;
    res->fl=1;
    res->fr=0;
    res->area=0;

    double ans=quad(res);
    free(res);

    ans=ans*4;

    printf("pi=%fn",ans);


}


double func(double x){
        x=(1-(x*x));
        x=sqrt(x);
        return x;
    }


double quad(struct args* arg){
    double m=(arg->l+arg->r)/2;
    double fm=func(m);
    double larea=(arg->fl+fm)*(m-arg->l)/2;
    double rarea = (fm+arg->fr)*(arg->r-m)/2;

    struct args* arg1 = (struct args*)malloc(sizeof(struct args));
    arg1->l=arg->l;
    arg1->r=m;
    arg1->fl=arg->fl;
    arg1->fr=fm;
    arg1->area=larea;

    struct args* arg2 = (struct args*)malloc(sizeof(struct args));
    arg2->l=m;
    arg2->r=arg->r;
    arg2->fl=fm;
    arg2->fr=arg->fl;
    arg2->area=rarea;
    if(fabs((larea+rarea)-arg->area)>error){
        if(threads<=1){
            larea=quad(arg1);
            rarea=quad(arg2);

            free(arg1);
            free(arg2);
        }

    }

    return(larea+rarea);
}

这个应该工作,但后来我尝试使quadfunction返回一个void指针而不是看起来像这样的double.

#include <stdio.h>`
 #include <stdlib.h>
 #include <math.h>

int threads=1;
double error=0.000001;
double func(double);
struct args{
         double l;
         double r;
         double fl; 
         double fr; 
         double area;};

void* quad(struct args*);

int main(int argc,char *argv[]) {

        struct args* res = (struct args*)malloc(sizeof(struct args));
        res->l=0;
        res->r=1;
        res->fl=1;
        res->fr=0;
        res->area=0;
        void* ans=quad(res);

        double val=*(double*)ans;
        val=val*4;

        free(res);


         printf("pi=%fn",val);
   }

 double func(double x){
    x=(1-(x*x));
    x=sqrt(x);
    return x;
    }

void* quad(struct args* arg){
    double m=(arg->l+arg->r)/2;
    double fm=func(m);
    double larea=(arg->fl+fm)*(m-arg->l)/2;
    double rarea = (fm+arg->fr)*(arg->r-m)/2;

    struct args* arg1 = (struct args*)malloc(sizeof(struct args));
    arg1->l=arg->l;
    arg1->r=m;
    arg1->fl=arg->fl;
    arg1->fr=fm;
    arg1->area=larea;

    struct args* arg2 = (struct args*)malloc(sizeof(struct args));
    arg2->l=m;
    arg2->r=arg->r;
    arg2->fl=fm;
    arg2->fr=arg->fl;
    arg2->area=rarea;
    if(fabs((larea+rarea)-arg->area)>error){
        if(threads<=1){
            void* p1=quad(arg1);
            void* p2=quad(arg2);
            larea=*((double*)p1);
            rarea=*((double*)p2);

            free(arg1);
            free(arg2);
        }
    }


    double ret= (larea+rarea);
    void*poin=&ret;

    return poin;
}

这个程序在编译时只给我一个完全不同的结果,0.042298而不是3.14159.我对C很新,并且使用指针,所以我确定我对转换搞砸了但是我不能为我的生活找出原因.

任何帮助弄清楚为什么这两个程序产生不同的结果将不胜感激.谢谢.

解决方法

您正在返回指向ret的指针. quad()的局部变量.当你看它时,它已被替换.

解除引用无效指针也是未定义的行为.这意味着您的编译器可以随意执行任何操作,例如格式化硬盘或启动WW3.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读