2010-01-07 66 views
1

我有一個用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

東西似乎。 。 。 off – Hazior 2010-01-07 13:51:02

+0

????什麼 ?????? – 2010-01-07 13:51:57

+1

爲什麼不發佈「正確初始化」的代碼? – 2010-01-07 13:59:23

回答

1

問題是因爲下一行:

struct tm * psttm;

它沒有初始化爲NULL。

0

我不太清楚,因爲localtime什麼是在這種情況下怎麼回事返回到靜態分配的內存的指針。對於localtime來說,非常不好的事情(tm)必須返回一個錯誤的指針。現在,如果timet結構的值不正確,MSDN將會返回一個NULL值。

我認爲在您的應用程序中存在已被丟棄的內存。

請問以下工作:

int getHourTime() 
{ 
    struct tm *psttm = NULL; 
    time_t timet; 

    time(&timet); 
    psttm = localtime(&timet); 

    int nHour = psttm->tm_hour; 
    return nHour; 
} 
+3

也許「/ /開始coorectly」不是我們被領導相信「coorect」... – 2010-01-07 13:57:15

+0

不,我檢查這與NULL和它表現相同。 – 2010-01-07 14:01:00

+0

調用'localtime'後的'errno'是什麼?如果'errno'爲零,那麼程序就會在某處丟棄私有內存。 – user7116 2010-01-07 14:06:23

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; 
} 
+0

看來'localtime'使用的時間緩衝區是使用'_malloc_crt'在每個線程的基礎上分配的。 HeapValidate是否是正確的用來確保它不被丟棄? – user7116 2010-01-07 14:12:37

0

這爲我工作:

time_t StartTime = time(NULL); 
struct tm * StartLocalTime = localtime(&StartTime); 
int hour = StartLocalTime->tm_hour; 

如果這行不通,它可能是你有一定的緩衝代碼中的溢出別的地方,並且它僅僅體現在這個函數中。