C函数中返回的struct导致分段错误

时间:2018-10-02 13:01:42

标签: c++ struct

我问这个问题更多是出于好奇,而不是实际需要,但这已经使我感到困惑了一段时间。我真的很想知道下面我的代码有什么问题。顺便说一句,BTW不会试图了解该功能的目的,而只是为了显示问题。

下面的代码在Linux(使用gcc)上运行时会导致分段错误,但在Windows(使用Visual Studio)上可以正常工作。据我所知,按值返回结构没有错,那么我在下面做错了什么?

#include <time.h>
#include <stdint.h>

using namespace std;

struct tm testFunc(const uint32_t rawtime) {
  struct tm * localTime;
  localTime = gmtime ((const time_t*)&rawtime);
  struct tm testval = *localTime;
  return testval;
}

int main() {
  uint32_t now = 1538442104;
  testFunc(now);
}

2 个答案:

答案 0 :(得分:3)

在Linux(至少在我的RHEL6机器上)上的

var/www/htmlnginxconf,在64位版本中,其大小为64位。您正在传递mongod --master 的地址,这意味着[ftdc] Rollback ID is not initialized yet. 正在读取四个垃圾字节,从而导致未定义的行为。

Windows似乎也默认使用64位SqlDataAdapter da = new SqlDataAdapter(select id,stdpic from student) dt.Clear(); da.Fill(dt); insert into team(teamid,teampic)values('"+dt.Rows[0][0].tostring()+"','"+dt.Rows[0][1].tostring()+"') ,但它has the option to make it use a 32 bit type的代价是最终触发了Y2038错误。无论哪种方式,它都可能偶然地在Windows上运行(毕竟,未定义的行为可能包含“按预期方式运行”)。

当值是巨大的垃圾时,time_t可能最终返回signed long,如果您尝试读取它,将导致段错误。

答案 1 :(得分:3)

gmtime行导致不确定的行为。 localTime = gmtime((const time_t*)&rawtime);正在将uint32_t*转换为time_t*,但不能保证大小相同,实际上在许多现代平台上time_t都是64位。

如果这不会导致崩溃,则gmtime可能会变得垃圾,然后返回null,这时testval = *localtime在从空指针读取时将崩溃。