Это
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 байтов памяти и отбрасывает случайный кусок кучи.