找不到静态字符数组但不使用strncpy?

时间:2010-08-31 19:44:57

标签: c string variables static char

char *  function decode time()
{ 

   tm *ptm; //time structure
    static char timeString[STRLEN]; //hold string from asctime()

    ptm = gmtime( (const time_t *)&ltime ); //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的值。

我想这只是一个调试器问题?但为什么我不能在调试器监视中看到静态数组的值?

2 个答案:

答案 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 *)&ltime ); //fill in time structure with ltime

  if( ptm )
  {
    strncpy(timeString, asctime( ptm ), sizeof(timeString)-1 );
  }

  return timeString;
}

如果使用本地静态,则代码不可重入/线程安全。