帮助解决结构中的分段错误

时间:2009-11-10 05:05:38

标签: c++ segmentation-fault

我在调试代码时遇到问题。我有一个结构和一个 用于计算以HH:MM:SS格式输入的时差的函数。 我的代码是:

const int hourConv = 3600; // used to get total hours from total seconds 
const int minConv = 60; 
struct MyTime { 
    int hours, minutes, seconds; 
}; 

MyTime *determineElapsedTime(const MyTime *time1, const MyTime *time2) 
{ 
        long timeOneSec = time1->hours*hourConv + time1->minutes*minConv + time1->seconds; 
        long timeTwoSec = time2->hours*hourConv + time2->minutes*minConv + time2->seconds; 
        long ans = timeTwoSec - timeOneSec; 
        cout << ans; 
        MyTime *timeDiff; 
        timeDiff->hours = ans / hourConv; 
        timeDiff->minutes = ans % hourConv / minConv; 
        timeDiff->seconds = ans % hourConv % minConv; 
        return timeDiff; 
} 

我相信第二行到最后一行的问题: timeDiff->seconds = ans%hourConv%minConv; 因为当我评论那条线路时, 我没有得到分段错误错误。但我不明白为什么 该行无效。任何帮助,将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:6)

您的代码包含:

MyTime *timeDiff;
timDiff->hours = ...

您已创建MyTime指针但未分配任何内容。此时timeDiff为null。

答案 1 :(得分:5)

您正尝试使用以下代码访问未分配的内存:

MyTime *timeDiff;
timeDiff->hours = ans / hourConv;

虽然你可以通过使用new来手动分配代码来解决这个问题,因为:

MyTime *timeDiff = new MyTime;
timeDiff->hours = ans / hourConv;

我强烈建议您更改函数以按值返回MyStruct,作为堆栈分配的变量。我还建议将参数作为const-by-const引用:

MyTime determineElapsedTime(MyTime const &time1, MyTime const &time2)
{
     long timeOneSec = time1.hours*hourConv + time1.minutes*minConv + time1.seconds;
     long timeTwoSec = time2.hours*hourConv + time2.minutes*minConv + time2.seconds;
     long ans = timeTwoSec - timeOneSec;
     cout << ans;
     MyTime timeDiff;
     timeDiff.hours = ans / hourConv;
     timeDiff.minutes = ans % hourConv / minConv;
     timeDiff.seconds = ans % hourConv % minConv;
     return timeDiff;
}

答案 2 :(得分:1)

另外一句话:在这种情况下使用OOP。它将使您的代码更具可读性。你最终会有更多时间考虑未初始化的记忆。

struct MyTime { 
    int hours, minutes, seconds; 
    int timeInSeconds() const {
        return hours*3600 + minutes*60 + seconds;
    }
    // the difference, in seconds
    int operator-( const MyTime other ) const {
        return timeInSeconds() - other.timeInSeconds();
    }
    void subtract( int seconds ) {
        seconds -= seconds;
        while( seconds < 0 ) { seconds += 60; --minutes; }
        while( minutes < 0 ) { minutes += 60; --hours; }
        assert( hours >= 0 );
    }
}; 

接下来,区分时间差和“绝对”时间值是个好主意。你可以添加两个时差,但你不能添加两个'日历'值。