2012-04-13 2 views
2

Я следующий кодStrLen из полукокса * таНос

char *new_str; 
int size_in_bytes; 
int length; 

size_in_bytes = 2*sizeof(char); 
new_str = (char *)malloc(size_in_bytes); 
length = strlen(new_str); 

Ожидая длина быть 2, на самом деле это 16. Может кто-нибудь объяснить, почему?

+1

Этот код читает за пределами выделенной памяти и может привести к неопределенному поведению –

+0

Используйте 'calloc()', тогда вы получите правильный ответ (который должен быть 0). Нет (переносного) способа определить размер выделенного блока (если в последнем стандарте нет чего-то нового). – TMN

ответ

5

strlen() возвращает индекс первого нуль-байта ('\ 0'), начиная с адреса, который вы передаете. Строки в C обычно всегда заканчиваются этим символом, чтобы отметить конец строки.

strlen() не возвращает длину фактического блока памяти.

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

Смежные вопросы