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

Cry*_*tal 1 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; 
} 
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*son 6

您的代码包含:

MyTime *timeDiff;
timDiff->hours = ...
Run Code Online (Sandbox Code Playgroud)

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

  • 我相信C/C++的价值在那时是不确定的(如果我错了,请纠正我) (3认同)
  • 它是null还是垃圾值? (2认同)

Jon*_*cto 5

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

MyTime *timeDiff;
timeDiff->hours = ans / hourConv;
Run Code Online (Sandbox Code Playgroud)

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

MyTime *timeDiff = new MyTime;
timeDiff->hours = ans / hourConv;
Run Code Online (Sandbox Code Playgroud)

我强烈建议您更改函数以按值返回MyStruct,作为堆栈分配的变量.我还建议将参数作为pass-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;
}
Run Code Online (Sandbox Code Playgroud)