2014-09-26 5 views
-7
int main() 
{ 
    char* tab=new char[14] ; 
    cout << " lenght with sizeof: "<<sizeof(tab)<<endl; 
    cout << " length with strlen: "<<strlen(tab)<<endl; 

    system(" pause"); 
    return 0; 
} 

Я получил выход:STRLEN возвращает неопределенное поведение с C++

длина с SizeOf: 4

Длина с StrLen: 30

я ожидаю результат sizeof но не то, что возвращается strlen!

Для тех, кто поспешит опубликовать, что это дублированный вопрос. Я хочу сказать, что это совсем не такая возможность. Потому что я знаю о времени компиляции и времени выполнения и многом другом относительно strlen и sizeof, однако я не могу найти объяснения этого результата.

Благодарим за помощь.

+1

'sizeof (tab)' дает размер указателя 'char *', а не размер выделенных пространств, или размер нулевой завершенной c-строки, хранящейся там. –

+5

Ваш массив 'char' не инициализирован, поэтому результат' strlen' не определен, так как он будет считать все символы до тех пор, пока не найдет нулевой символ. – Geoffroy

+0

@ πάντα ῥεῖ Спасибо друг другу. Я согласен с тобой, но ты не понимаешь моего вопроса, я спрашиваю о возвращенном результатом, который вам 30 лет! – xtensa1408

ответ

3

Поскольку вы выделяете массив символов, но не инициализируете его, strlen() будет отсчитывать с начала указателя tab до первого символа NUL. Таким образом, результат зависит от содержимого кучи вашей программы.

+4

Следует, наверное, упомянуть, что это неопределенное поведение. – Rapptz

+0

Как есть, это хороший ответ. – Deduplicator

+0

Не стесняйтесь объяснять, что плохого в этом, или дать лучший ответ. –