我正在用C编写一个简单的程序,将浮点输出为int和hex等。
对于这项任务,我基本上不允许改变任何东西。
我有一个函数getNextFloat(&f),它接受“float f;”的地址,调用scanf来获取float值,然后返回一个指向新的f值的指针,该值被发送到打印函数(它将float值转换为十六进制和其他表示形式)。
我的问题是,当我运行程序时,当我在getNextFloat函数中调用scanf并输入一个数字时,如果我立即在getNextFloat函数中打印*f,它会打印得很好,但是如果我在print函数中返回*f并打印'f',无论我在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,这是我在getNextFloat函数中对printf的测试程序调用,显示它扫描正确,问题出在别处。
接下来的两个值显然是在调用print函数时存储在f中的值。
谢谢你的洞察力
最佳答案
让我们回顾一下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
所指向的内存(应该是f
中名为main
的变量)您要做的是将
f = &fl;
行更改为*f = fl;
关于c - 返回的浮点指针未永久存储数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29739748/