我有一些代码可以添加分数。
#include <stdio.h>
#include <stdlib.h>
struct frac
{
int enumerator;
int denominator;
};
typedef struct frac frac_t;
frac_t *Add(frac_t *b1, frac_t *b2)
{
frac_t rfrac;
frac_t *p;
p = &rfrac;
(*p).enumerator= ((*b1).enumerator* (*b2).denominator) + ((*b2).enumerator* (*b1).denominator);
(*p).denominator= ((*b1).denominator* (*b2).denominator);
return p;
}
int main(void)
{
frac_t b1 = {2,4};
frac_t b2 = {1,7};
frac_t *add = Add(&b1, &b2);
printf("%i %i\n", add->enumerator, add->denominator);
system("pause");
return 0;
}
这工作得很好。结果是:3 5,因为它应该是。
如果我添加一个“printf”,它会完全弄乱我的结果:
int main(void)
{
frac_t b1 = {2,4};
frac_t b2 = {1,7};
frac_t *add = Add(&b1, &b2);
printf("addition:\n");
printf("%i %i\n", add->enumerator, add->denominator);
system("pause");
return 0;
}
结果是:
补充:
2008958704 -1
出了什么问题?
最佳答案
您的函数 Add
正在返回一个指向在该函数中创建的临时变量的指针。一旦该函数返回,程序就可以以任何它希望的方式使用该内存;你不应该再访问它了。第一次你很幸运——程序碰巧留下了那个内存区域,你的结果被保存了下来。添加第二个 printf
会导致对堆栈内存的额外修改,这会覆盖您的原始值并暴露错误。
您应该将指向 frac_t
的指针传递给函数 Add
而不是获取结果。例如:
void Add(frac_t *result, frac_t *b1, frac_t *b2) {
// modify result here
}
关于c - Printf 似乎弄乱了一个简单 C 程序的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1855663/