我有一个用C编写的DLL,我必须使用它。 没关系,但在一个地方我收到了错误。
int getHourTime()
{
struct tm *psttm;
time_t timet = //is initialzed correctly
psttm = localtime(&timet);
int nHour = psttm->tm_hour;
return nHour;
}
我使用DLLImport在C#中调用它。 上线:“psttm-> tm_hour”我得到一个错误(抛出)“试图读取或写入受保护的内存”。我明白这是因为它返回一个指向struct tm内部位置的指针,但我该如何解决呢?
由于
答案 0 :(得分:1)
问题是因为下一行:
struct tm * psttm;
它没有初始化为NULL。
答案 1 :(得分:0)
我不太确定在这种情况下发生了什么,因为localtime
返回一个指向静态分配内存的指针。非常糟糕的事情(tm)必须正在进行localtime
才能返回错误的指针。现在,如果您的timet
结构具有错误值,则MSDN会声明将返回NULL
值。
我认为你的应用程序中存在已经破坏的内存。
以下是否有效:
int getHourTime()
{
struct tm *psttm = NULL;
time_t timet;
time(&timet);
psttm = localtime(&timet);
int nHour = psttm->tm_hour;
return nHour;
}
答案 2 :(得分:0)
int getHourTime()
{
struct tm *psttm;
time_t timet = //is initialzed coorectly
// what is psstm? Set a breakpoint on this line and look at it
// before and after executing localtime()
psttm = localtime(&timet);
// if it's non-null then you can also do this:
#if _DEBUG
if (!HeapValidate(GetProcessHeap(), HEAP_NO_SERIALIZE, psttm)) {
puts("bad ptr in getHourTime");
}
#endif
int nHour = psttm->tm_hour;
return nHour;
}
答案 3 :(得分:0)
这对我有用:
time_t StartTime = time(NULL);
struct tm * StartLocalTime = localtime(&StartTime);
int hour = StartLocalTime->tm_hour;
如果这不起作用,可能你的代码中的其他地方有一些缓冲区溢出,它只是在这个函数中表现出来。