char * function decode time()
{
tm *ptm; //time structure
static char timeString[STRLEN]; //hold string from asctime()
ptm = gmtime( (const time_t *)<ime ); //fill in time structure with ltime
if(ptm)
{
strncpy(timeString, asctime( ptm ), sizeof(timeString) );
//EDIT
sprintf(test, "Sting is: %s", timeString);
return timeString;
.
.
} //end function
当我逐步调试调试器中的代码时,我可以看到timeString的值是:
timeString CXX0017:错误:未找到符号“timeString”
但是,当我从timeString中删除工作“static”时,它确实正确地填充了字符串,但现在是一个本地副本并将被销毁。
为什么我无法将此函数中的字符串复制到静态字符数组中?
Visual Studio 6.0 - MFC
感谢。
修改 “test”字符串确实包含timeString的值。
我想这只是一个调试器问题?但为什么我不能在调试器监视中看到静态数组的值?
答案 0 :(得分:2)
这是一个Debug或Release版本吗?
您可以使用VC ++ 2010 Express吗?它是免费的,除非你使用“视觉”设计师或MFC,否则它可能会更好。
我很长一段时间没有使用过VC ++ 6.0,但是我使用的其他一些调试器似乎都很难用静态变量,一个简单的解决方案就是:
static char timeString[STRLEN]; //hold string from asctime()
#if _DEBUG
char* timeStringDebugRef = timeString;
#endif
然后观看timeStringDebugRef
而不是timeString
。
[编辑]
VC ++ 6.0支持许多调试格式,其中包含链接器和编译器(described here)的选项。确保你可能正确配置了它?
答案 1 :(得分:2)
首先,函数名称应为
function_decode_time()
不是function decode time()
使用本地静态timeString将使用'\ 0'初始化整个,而不保证静态 如果没有静态,则调用上下文中的返回值是未定义的。
strncpy不会在timeString中添加'\ 0'以使用“sizeof(timeString)”,参见definition; 因此,您必须添加'\ 0',例如:
char * functionDecodeTime()
{
tm *ptm; /* time structure */
static char timeString[STRLEN]; /* hold string from asctime() */
memset( timeString, 0 , sizeof timeString ); /* entire content always is defined ! */
ptm = gmtime( (const time_t *)<ime ); //fill in time structure with ltime
if( ptm )
{
strncpy(timeString, asctime( ptm ), sizeof(timeString)-1 );
}
return timeString;
}
如果使用本地静态,则代码不可重入/线程安全。