【问题标题】:Segmentation Fault upon call to GetSystemTime() function (Windows)调用 GetSystemTime() 函数时出现分段错误 (Windows)
【发布时间】:2013-07-31 19:39:07
【问题描述】:

我在处理分段错误时遇到了麻烦。以下健全性检查抛出一个:

#include <windows.h>
int main()
{
    LPSYSTEMTIME startTime;
    GetSystemTime(startTime);
}

但是,我在一个更大的程序中使用了相同的代码,它运行没有问题。我尝试在各个地方添加延迟,以防问题源于GetSystemTime() 中的某种多线程,但它并没有解决问题。

我正在 CodeBlocks 中使用 MinGW-GCC 进行编译。

【问题讨论】:

    标签: c++ windows


    【解决方案1】:

    LPSYSTEMTIME 是指向SYSTEMTIME 结构的指针。您没有初始化指针,所以它指向风景中的某个地方,因此访问冲突/段错误。

    为了使代码正常工作,您必须确保指针指向有效的SYSTEMTIME 结构。根据MSDN docs,Microsoft 明确警告您,为指针传递 NULL 将导致访问冲突。

    【讨论】:

    • 谢谢。我真的不喜欢微软如何为所有东西定义不同的名称——它只会让一切变得更加混乱。
    • 一般来说,当您看到 LP 时,它们的意思是 Long Pointer...(long 是历史性的)。一般来说,如果你从一个类型中剥离 LP,你就会在堆栈上拥有带有分配存储的实际结构......例如SYSTEMTIME,那么你会通过&amp;startTime
    【解决方案2】:

    您正在使用未初始化的指针。这样效果更好:

    #include <windows.h>
    int main()
    {
        SYSTEMTIME startTime;
        GetSystemTime(&startTime);
    }
    

    【讨论】:

      【解决方案3】:

      LPSYSTEMTIME 是一个指针,你需要分配内存或者你需要在 LPSYSTEMTIME 中释放 LP 并调用函数,如下所示:

      SYSTEMTIME startTime;
      GetSystemTime(&startTime);
      

      【讨论】:

        【解决方案4】:

        LPSYSTEMTIME 是指向SYSTEMTIME 的指针,但尚未初始化。

        试试这个:

        SYSTEMTIME startTime = { 0 };
        GetSystemTime(&startTime);
        

        【讨论】:

          【解决方案5】:

          要使用 LPSYSTEMTIME,您应该编写以下内容:

          SYSTEMTIME  systemTime; //allocation of memory
          printf("%p\n", &systemTime.wDay); // we can see address of wDay for example.
          LPSYSTEMTIME st = &systemTime;
          GetSystemTime(st);
          printf("%d \n", st->wDay);  //display result 
          printf("%d \n", (*st).wDay); //display the same result
          

          【讨论】:

            猜你喜欢
            • 2011-01-08
            • 1970-01-01
            • 2018-12-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多