我问这个问题更多是出于好奇,而不是实际需要,但这已经使我感到困惑了一段时间。我真的很想知道下面我的代码有什么问题。顺便说一句,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);
}
答案 0 :(得分:3)
var/www/html
是nginxconf
,在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
在从空指针读取时将崩溃。