c++ - 在 C 函数中返回结构会导致段错误

标签 c++ struct

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

下面的代码在 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);
}

最佳答案

time_t 在 Linux 上(至少在我的 RHEL6 机器上是这样)是一个 signed long,在 64 位构建中它的大小为 64 位。您正在传递 uint32_t 的地址,这意味着 gmtime 正在读取四个垃圾字节,调用未定义的行为。

Windows 似乎也默认为 64 位 time_t,但它 has the option to make it use a 32 bit type以最终触发 Y2038 错误为代价。无论哪种方式,它可能只是巧合地在 Windows 上工作(毕竟,未定义的行为可能包括“按预期工作”)。

当该值是巨大的垃圾时,gmtime 可能最终返回 NULL,如果您尝试读取它会导致段错误。

关于c++ - 在 C 函数中返回结构会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52608891/

相关文章:

c++ - 在 C++ 中初始化数组指针的正确方法?

c++ - 拼写检查器 C++;检查单词是否在字典文本中

C 头文件给出错误 "VERTEX has no member ' p'"

c++11 - 将 C++ 程序移植到 Rust : Of reinterpret_cast, 结构和蓝牙

c - 读取文件.txt并将其保存到c中的struct

c++ - 比 strncpy 更好的复制 char 数组部分的方法

c++ - 将 GetVersionEx 数字转换为操作系统名称

c++ - 在函数声明之后声明一个整数有什么用?

c - 如何在c中的另一个函数之前和之后执行公共(public)代码?

c++ - 调试中的 Eclipse CDT View 结构