C++ 在C函数中返回struct会导致分段错误

C++ 在C函数中返回struct会导致分段错误,c++,struct,C++,Struct,我问这个问题更多的是出于好奇,而不是出于实际需要,但这让我困惑了一段时间。我很想知道我下面的代码有什么问题。顺便说一句,不要试图理解函数的目的——它只是为了说明问题 下面的代码在Linux(使用gcc)上运行时会导致分段错误,但在Windows(使用Visual Studio)上工作正常。据我所知,按值返回结构没有什么错,那么下面我做错了什么 #include <time.h> #include <stdint.h> using namespace std; stru

我问这个问题更多的是出于好奇,而不是出于实际需要,但这让我困惑了一段时间。我很想知道我下面的代码有什么问题。顺便说一句,不要试图理解函数的目的——它只是为了说明问题

下面的代码在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);
}
#包括
#包括
使用名称空间std;
struct tm testFunc(const uint32_t rawtime){
struct tm*本地时间;
localTime=gmtime((常量时间*)&rawtime);
struct tm testval=*localTime;
返回testval;
}
int main(){
uint32_t now=1538442104;
testFunc(现在);
}

time\t
在Linux上(至少在我的RHEL6框上)是一个
签名长
,在64位构建中大小为64位。您正在传递一个
uint32\u t
的地址,这意味着
gmtime
正在读取四个垃圾字节,调用未定义的行为

Windows似乎也默认使用64位
时间,但最终会触发Y2038错误。无论哪种方式,它可能只是巧合地在Windows上工作(毕竟,未定义的行为可能包括“按预期工作”)


当值是巨大的垃圾时,
gmtime
可能最终返回
NULL
,如果您试图读取它,这将导致segfault。

gmtime
行导致未定义的行为<代码>本地时间=gmtime((常数时间*)&rawtime)正在将
uint32\u t*
转换为
time\u t*
,但不能保证大小相同,事实上在许多现代平台上
time\u t
为64位


如果它没有崩溃,那么<代码> GMSTIME>代码>很可能会被垃圾,然后返回NULL,在这个点上,将从一个空指针读取崩溃。

@ USE1810077,您不需要,至少在C++中,这是为一些标记的。reason@Cliff你使用C还是C++?问题在TestFUNC中main()函数只是用来运行函数的。另外,我没有使用testFunc()的返回值这里是故意的-只是为了表明即使我不尝试使用返回值,它也会崩溃。@NathanOliver我使用的是C++你的
time\t
不是
uint32\t
。这是未定义的行为。请阅读手册页。谢谢!这很快!