Выделение памяти с помощью malloc и поиск strlen () - PullRequest
0 голосов
/ 17 февраля 2012
int main(){
    char *ptr = (char*)malloc(10);
    printf("%d",strlen(ptr));
}

Вывод 11. Я не понял, почему это так?

Ответы [ 4 ]

7 голосов
/ 17 февраля 2012

Вы не записали никаких данных в свой блок malloc.В нем есть старые байты, нет способа узнать, что в нем содержится.strlen просто ищет следующий нулевой байт.Я думаю, вы нашли один 11 байт, но это могли быть тысячи байт.

Вы смотрите на неопределенное поведение.

0 голосов
/ 17 февраля 2012

Сделайте это:

int main(){ 
    char *ptr = (char*)malloc(10); 
    memcpy(ptr,0,10); 
    printf("%d",strlen(ptr)); 
}
0 голосов
/ 17 февраля 2012

Ваш код возвращает 11, но это просто совпадение . В общем, вы получаете неопределенное поведение.

Проблема в том, что в C строка завершена нулем . Это означает, что символ \ 0 обозначает конец строки.

int main(){
    char *ptr = (char*)malloc(11);
    ptr[10]=0;
    printf("%d",strlen(ptr));
}

Это вернет значение <= 10. Всегда. </p>

0 голосов
/ 17 февраля 2012

Вы выделяете 10 байтов памяти, которая может хранить мусор. Помните, что strlen () читает, пока не будет найден \0.

В идеале, после выделения нового блока вы должны выполнить: memset(ptr, 0, 10);

...