C ++ - как проверить, если char * указывает на что-то действительное? - PullRequest
1 голос
/ 06 декабря 2011

Я хочу проверить, указывает ли символ * на правильную строку ... Могу ли я проверить эту переменную ...

char* c;

Что я пробовал:

if(c == NULL)  //c is not null
if(*c == '\0') //false
if(strlen(c) == 0)  //exception

Iдумаю, что невозможно проверить символ *, когда он не был выделен, и не указывать на правильную строку ...

Ответы [ 5 ]

5 голосов
/ 06 декабря 2011

Правда, вы никогда не можете быть уверены, что указатель действителен. Тестирование на NULL может дать вам уверенность в том, что оно недействительно, но не гарантирует его достоверность. Это одна из причин не использовать подобные вещи в C ++. std::string всегда в действительном состоянии.

4 голосов
/ 06 декабря 2011

Если указатель не является NULL, невозможно сказать, является ли значение указателя действительным или нет.

2 голосов
/ 06 декабря 2011

c может указывать куда угодно.Это может быть строка с нулевым символом в конце, строка без завершающего нулевого байта, любые доступные двоичные данные или любой адрес, который недоступен.Что именно вы хотите проверить и почему?Если вы хотите различать допустимую строку и неинициализированную, вы обычно используете NULL для неинициализированного регистра и проверяете c == NULL.Доступ к * c (это делает и strlen) не подходит, если c не является допустимым указателем.Таким образом, типичный вариант использования будет выглядеть так:

// initializing to NULL
char *c = NULL;
// maybe setting value
if(condition)
  c = strdup("mein string");
// cleanup
if(c != NULL) {
  free(c);
  c = NULL;
}
1 голос
/ 06 декабря 2011

Если у вас есть верхняя граница размера ожидаемой строки:

char * c = new char[size];

тогда, возможно, вы можете проверить, заканчивается ли он в пределах:

bool is_valid(char *c, size_t size) { 
     while (size--) if (*c) return true;
     return false;
   }

другим способом является инкапсуляция char * внутри класса в конструкторе или наличие действительного флага в таком классе.

0 голосов
/ 06 декабря 2011

Это зависит от O / S.В Windows у вас есть семейство функций IsBadXxxPtr(), которые будут проверять указатель на действительную память, хотя они не будут проверять, является ли указатель действительным экземпляром определенного типа.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366713(v=vs.85).aspx и т. Д.

...