Стрлен в Маллоке - PullRequest
       1

Стрлен в Маллоке

2 голосов
/ 13 марта 2012

Почему это не возвращает никаких предупреждений? Что должно быть не так с кодом?

char *str = malloc(strlen("hello" + 1));
strcpy(str, "hello");

Спасибо! * * 1004

Ответы [ 3 ]

8 голосов
/ 13 марта 2012

Почему вы ожидаете предупреждений?

Код не работает, потому что вы должны делать strlen("hello") + 1, а не strlen("hello" + 1) (что эквивалентно strlen("ello")).

6 голосов
/ 13 марта 2012

Это

char *str = malloc(strlen("hello" + 1));
strcpy(str, "hello");

почти эквивалентно:

char *temp = "hello";
char *temp2 = temp + 1;

char *str = malloc(strlen(temp2));
strcpy(str, "hello");

поэтому temp + 1 является математикой указателя (возвращает указатель на ello, а strcpy не проверяет, достаточно ли памяти в месте назначения («стандартное» повреждение памяти, вызванное ошибочным кодом в C)

Конечным результатом является то, что strlen возвращает 4, strcpy использует 6 байтов памяти и отбрасывает случайный кусок кучи.

1 голос
/ 13 марта 2012

Неверное утверждение ниже.

char *str = malloc(strlen("hello" + 1)); 

должно быть

char *str = malloc(strlen("hello") + 1);

в этом случае strlen, вероятно, вернет вам значение 4 вместо 5, а strcpy приведет к записи за пределы. Запустите программу с анализатором памяти, и она покажет вам ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...