c++:结构中的int值无缘无故地改变值

标签 c++ c struct

<分区>

我想在学习 java 之后学习 c++。有人告诉我,这些结构很像 Java 中带有实例变量的类。分数结构中的“整体”值似乎在 isDivisible 函数中随机从 1 变为 0。为什么会这样?请不要遗漏细节。谢谢你的帮助

#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;

#define LARGEST(a,b) ((a > b) ? 1 : 0)

struct fraction {
    int numerator;
    int denominator;
    int whole;
};

fraction* wholeNumber(fraction * frac){
    if (LARGEST((frac->numerator), (frac->denominator)) == 1){
        double w = (((double) (frac->numerator)) / ((double) (frac->denominator)));
        int whole = floor(w);
        struct fraction now = { (frac->numerator) - whole*(frac->denominator),
                (frac->denominator), whole};
        return &now;
    }

    return frac;
}

int toCheck[4] = {2,3,5,7}; 

int isDivisible(fraction * frac){
    double newNum = (double) frac->numerator;
    double newDen = (double) frac->denominator;
    // The value of whole seems to change right about here after the two doubles are declared
    for(int i = 0; i < 4; ++i){
        if (( (newNum / toCheck[i]) == (frac->numerator / toCheck[i]) ) ? true : false &&
                ((newDen / toCheck[i]) == (frac->numerator / toCheck[i]) ) ? true : false)
            return toCheck[i];
    }
    return 0;
}

fraction* simplifier(fraction * frac){
    frac = wholeNumber(frac);
    while(isDivisible(frac) != 0){
        int factor = isDivisible(frac);
        frac->numerator = frac->numerator / factor;
        frac->denominator = frac->denominator / factor;
    }

    return frac;
}

int main (int argc, char ** argv){
    struct fraction frac = {55, 50, 0}; // fraction declared, 0 55/50
    struct fraction * final = simplifier(&frac);

    printf("%d %d/%d\n", final->whole, final->numerator, final->denominator);

    return 0;
}

最佳答案

您在编译时是否收到此警告(或类似警告)?

example.cpp:20:17: warning: address of stack memory associated with local
      variable 'now' returned [-Wreturn-stack-address]
        return &now;
                ^~~

返回指向堆栈变量的指针是个坏消息。如果您的编译器没有警告您,您需要打开更多警告标志(或获得更好的编译器 - 我上面的引述来自 clang,它有非常好的错误消息,可能是因此对于初学者来说是个不错的选择)。

您的问题的长短在于 now 在函数结束时超出范围。这意味着访问您返回的指针会导致未定义的行为。

您可能希望在您的程序中使用更少的指针 - 如果您使用 C++,您可以访问引用,但除此之外,C 和 C++ 允许按值传递结构,这可能会让您的生活学习时更容易。

关于c++:结构中的int值无缘无故地改变值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18517773/

相关文章:

c++ - C++17 中的 std::make_shared() 更改

c++ - 棋子移动错误

c - 在 C 中转换时出现问题

c - 为什么 libc 中的内存分配没有路由到我的分配包装器?

c - 如何理解数组中的this指针?

c - PowerPC 编译器的结构体数组

c++ - 在用 C++ 编译的 C 库中如何处理运行时错误?

c++ - 刷新 GLUT 窗口

c - 未初始化的局部变量!

java - 修改当前实例的副本会影响当前实例吗? ( java )