Скажет, у меня есть код:Переполнение не обнаружено при записи нулевого символа в середине строки?
char* word = malloc (sizeof(char) * 6);
strcpy(word, "hello\0extra");
puts(word);
free(word);
Это компилирует просто найти и Valgrind не имеет проблем, но есть на самом деле проблема? Похоже, я пишу в память, что я не владею.
Кроме того, отдельный вопрос, но когда я переполнить мой буфер с чем-то вроде
char* word = malloc (sizeof(char) * 6);
strcpy(word, "1234567\0");
puts(word);
free(word);
Он печатает 1234567 и Valgrind делает поймать эту проблему. Каковы последствия этого? Кажется, он работает каждый раз. Пожалуйста, поправьте меня, если это не так, но из того, что я понимаю, возможно, что другая программа возьмет память мимо 6 и напишет в нее. Если это произойдет, будет ли печатание слова просто продолжаться вечно, пока он не встретит нулевого символа? Этот персонаж просто запутался для меня в изучении струн C.
О, единственная реальная проблема - вы получите неприятный случай с NASAL DEAMONS. – IdeaHat
'strcpy (word," hello \ 0extra ");' остановится после 6-го символа (терминатора), поэтому нет никаких проблем с этим надуманным примером. –
Ваш второй вопрос: 'strcpy' скопирует все, что вы скажете, в пространство переполнения, если оно не вызывает ошибку сегмента. Независимо от того, что это сломает, зависит от того, что оно переписало. Просто предположим, что это что-то сломает. –