返回浮点指针不会永久存储数据

时间:2015-04-20 05:12:45

标签: c pointers

我在C中编写一个简单的程序来输出一个浮点数作为int和十六进制等。

对于此作业,我不允许更改主要内容。

我有一个函数getNextFloat(& f),它接受' float f的地址;'调用scanf获取浮点值,然后返回一个指向f的新值的指针,该值被发送到我的print函数(它将float值转换为hex和其他表示形式)。

我的问题是,当我运行程序时,当我在函数getNextFloat中调用scanf并输入一个数字时,如果我立即在getNextFloat函数内打印* f它打印正常,但如果我返回* f并打印&# 39; F'在print函数中,无论我在getNextFloat中输入什么数字,它的值都是0。我不确定为什么' f'没有被保存,似乎是getNextFloat的本地。

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

static char *studentName = "me";

// report whether machine is big or small endian:

void bigOrSmallEndian()
{
        // irrelevant to question; contains code to report 'endian-ness'
}

// note: the following 3 comments are instructions from the teacher
// get next float using scanf()
// returns 1 (success) or 0 (failure)
// if call succeeded, return float value via f pointer:

int getNextFloat(float *f)
{
        float fl;

        scanf("%f", &fl);
        f = &fl;
        printf("%f", *f);
        return *f;
}

void printNumberData(float f)
{
        // note: function is incomplete, trying to fix this pointer thing first

        printf("%10f", f);
        printf("%10x\n", f);
}

// do not change this function in any way
int main(int argc, char **argv)
{
        float   f;
        int     nValues;

        printf("CS201 - A01 - %s\n\n", studentName);
        bigOrSmallEndian();
        for (;;) {
                if(argc == 1)
                        printf("> ");
                nValues = getNextFloat(&f);
                if(! nValues) {
                        printf("bad input\n");
                        while (getchar() != '\n');
                        continue;
                        }
                printNumberData(f);
                if(f == 0.0)
                        break;
                }
        printf("\n");
        return 0;
}

举个例子,这是我运行代码时得到的结果:

byte order: little-endian

> 9
9.000000  0.000000  7ffffff5

它打印的第一个值是9.000000,是测试者对printf的调用,我把它放在我的getNextFloat函数中,表明它正确扫描,问题出在其他地方。

接下来的两个值是调用打印函数时显然存储在f中的值。

感谢您的见解

2 个答案:

答案 0 :(得分:4)

让我们了解getNextFloat

中发生的事情
int getNextFloat( float *f ) {
        float fl; // declare a stack variable named fl, containing junk at this point
        scanf( "%f", &fl ); // read a value into fl
        f = &fl; // f now points to fl, which is on the stack
        return *f; // return the value of fl truncated to an integer
} // pop fl from the stack, the next thing to be pushed onto the stack will overwrite the contents of what f was pointing to

请注意,从函数内部对f 作为值的任何修改都不会修改函数外的任何值。 f实际上是一个局部变量,除非你取消引用它并写入f指向的内存(应该是fmain的变量1}})

您想要做的是将f = &fl;行更改为*f = fl;

答案 1 :(得分:0)

不要像每个编辑器那样使用制表符进行缩进 标签停止/标签宽度设置不同。 I.E.使用(比如说)4个空格以便于缩进。

此行,在getNextFloat()

f = &fl;

是倒退。

应该是:

*f = fl;

请记住,如果scanf成功,则返回1,否则返回0

总的来说,这个功能应该是:

int getNextFloat(float *f)
{
        float fl;
        int success = 0;

        success = scanf("%f", &fl);

        // always place literal on left
        // so an error like '=' will be caught by the compiler
        if(1 == success )
        { // then scanf successful
            *f = fl;
            //printf("%f", *f);
        }
        else
        { // else, overwrite possible EOF value in success
            success = 0;
        }
        return success;
} // end function: getNextFloat