c - Printf 似乎弄乱了一个简单 C 程序的输出

标签 c pointers structure printf

我有一些代码可以添加分数。

#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/

相关文章:

c - "buffer[gotten] = '\0';"在此代码中的作用是什么?

c - 从堆栈弹出时输出错误

Delphi - 什么对象(多维数组等)可以工作?

c++ - 为什么有两种通过指针调用函数的方式?

c - 结构体/结构体值的内存分配

c - 如何使用C在目录内创建文件

c - 将任意大小的二维结构数组传递给 C 中的函数

c - 在 C 中读取以前未知大小的矩阵

c++ - 交换指针,删除第二个对象并创建指向第二个的新指针

C++ |方法作用域指针管理