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 的值。
我想这只是一个调试器问题?但为什么我在调试器监视中看不到静态数组的值?
最佳答案
首先,函数名称应该是
function_decode_time()
不是函数解码时间()
使用本地静态 timeString 将用 '\0' 整个初始化,没有静态则不能保证 如果没有静态,调用上下文中的返回值是未定义的。
strncpy 不会在 timeString 中添加 '\0' 来使用 "sizeof(timeString)",参见定义; 因此您必须添加“\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;
}
如果您使用本地静态,您的代码不是可重入/线程安全的。
关于c - 未找到静态字符数组且无法与 strncpy 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3612614/