Статический массив символов не найден и не работает с strncpy? - PullRequest
2 голосов
/ 31 августа 2010
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

При выполнении пошагового выполнения кода в отладчике II можно увидеть значение timeString:
timeString CXX0017: Ошибка: символ «timeString» не найден

Однако при удаленииРаботая "static" из timeString, он корректно заполняется строкой, но теперь является локальной копией и будет уничтожен.

Почему я не могу скопировать строку из этой функции в статический массив символов?

Visual Studio 6.0 - MFC

Спасибо.

РЕДАКТИРОВАТЬ строка "test" содержит значение timeString.

Полагаю, это проблема отладчика?но почему я не вижу значения статического массива в отладчике?

Ответы [ 2 ]

2 голосов
/ 01 сентября 2010

Во-первых, имя функции должно быть function_decode_time() не function decode time()

с локальным статическим timeString будет инициализироваться целиком с '\ 0', без статического не гарантируется без статического значения возвращаемое значение в контексте вызова не определено.

strncpy не будет добавлять '\ 0' в timeString для использования "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 *)&ltime ); //fill in time structure with ltime

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

  return timeString;
}

Если вы используете локальную статику, ваш код не является реентерабельным / поточно-ориентированным.

2 голосов
/ 01 сентября 2010

Это сборка 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 поддерживает несколько форматов отладки с опциями как для компоновщика, так и для компилятора (здесь описано ).Убедитесь, что он настроен соответствующим образом, возможно?


...