Could someone please help me to solve unhandled exception error when using visual C++ 2008? the error is displayed as follow: Unhandled exception at 0x00411690 in time.exe: 0xC0000005: Access violation reading location 0x00000008
Some details:
- tm 0x00000000 {tm_sec=??? tm_min=??? tm_hour=??? ...} tm * tm_sec CXX0030: Error: expression cannot be evaluated ...Actually when I used visual c++ 6 in the past, there weren't any error and the program was running fine. But now ehen I use visual 2008, I am getting this Unhandled exception error.
Here is the program:
...
int gettimeofday(struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
unsigned __int64 tmpres = 0;
static int tzflag = 0;
if (NULL != tv)
{
GetSystemTimeAsFileTime(&ft);
tmpres |= ft.dwHighDateTime;
tmpres <<= 32;
tmpres |= ft.dwLowDateTime;
tmpres /= 10; /*convert into microseconds*/
/*converting file time to unix epoch*/
tmpres -= DELTA_EPOCH_IN_MICROSECS;
tv->tv_sec = (long)(tmpres / 1000000UL);
tv->tv_usec = (long)(tmpres % 1000000UL);
}
if (NULL != tz)
{
if (!tzflag)
{
_tzset开发者_StackOverflow中文版();
tzflag++;
}
tz->tz_minuteswest = _timezone / 60;
tz->tz_dsttime = _daylight;
}
return 0;
}
uint32_t stampstart()
{
struct timeval tv;
struct timezone tz;
struct tm *tm;
uint32_t start;
gettimeofday(&tv, &tz);
tm = localtime(&tv.tv_sec);
printf("TIMESTAMP-START\t %d:%02d:%02d:%d (~%d ms)\n", tm->tm_hour,
tm->tm_min, tm->tm_sec, tv.tv_usec,
tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
tm->tm_sec * 1000 + tv.tv_usec / 1000); /////---debugger stops here---
start = tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
tm->tm_sec * 1000 + tv.tv_usec / 1000;
return (start);
}
thanks for your replies:
Try Something like...
tm = localtime(&tv.tv_sec);
if(tm)
{
printf("TIMESTAMP-START\t %d:%02d:%02d:%d (~%d ms)\n", tm->tm_hour,
tm->tm_min, tm->tm_sec, tv.tv_usec,
tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
tm->tm_sec * 1000 + tv.tv_usec / 1000);
start = tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
tm->tm_sec * 1000 + tv.tv_usec / 1000;
}
else
{
// failed to retrive local time
}
The access violation refers address 0x00000008, which probably means that your code is accessing a field at offset 8 in a struct to which you point with a NULL pointer. I guess that localtime returns a NULL pointer. Check this.
"Access violation reading location 0x00000008"
An address that low is probably caused by accessing a null pointer. In this case, tm
is probably 0 because of a problem with localtime
or gettimeofday
. You get address 0x08 instead of 0x00 because the compiler is trying to read a value 8 bytes into the struct.
The type of member tv.tv_sec
is long
, but localtime
expects a time_t *
parameter. In VC6 this worked because both long
and time_t
were 32-bit, but in VS2008 time_t
is a 64-bit type so they are incompatible.
This should fix it:
//add to beginning of stampstart function:
time_t t;
//... other code...
//put this instead of call to localtime:
t = tv.tv_sec;
tm = localtime(&t);
With that address, my SWAG is that tm is NULL. Since you never check for the NULL after the call to localtime(), you are dereferencing a NULL pointer.
Edit: SWAG = Scientific Wild Ass Guess.
The address 0x00000008 is the same offset of tm.tm_hour. You are trying to access tm->tm_hour when you pass in the parameter to printf().
To catch this kind of exception a minor project tweaking is needed. Just enable /EHa option in project settings. See Project Properties -> C/C++ -> Code Generation -> Modify the Enable C++ Exceptions to "Yes With SEH Exceptions". That's it!
See details here: http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx
精彩评论