Спасибо за ответы, все были полезны, помогая мне понять, как это работает.Друг прислал мне фрагмент, который я не понимаю. Как это работает?
Друг прислал мне этот кусок кода С, спрашивающий, как он работает (он тоже не знает). Обычно я не работаю с C, но это вызвало мой интерес. Я потратил некоторое время, пытаясь понять, что происходит, но в конце концов я не мог полностью понять это. Вот код:
void knock_knock(char *s){
while (*s++ != '\0')
printf("Bazinga\n");
}
int main() {
int data[5] = { -1, -3, 256, -4, 0 };
knock_knock((char *) data);
return 0;
}
Первоначально я думал, что это просто фантазия способ печати данных в массиве (да, я знаю: \), но тогда я был удивлен, когда я увидел, что это не напечатайте «Bazinga» 5 раз, но 8. Я искал материал и выяснял, что он работает с указателями (общий любитель, когда дело доходит до c), но я все еще не мог понять, почему 8. Я искал немного больше и нашел что обычно указатели имеют 8 байтов длины в C, и я подтвердил, что, печатая sizeof (s) перед циклом, и, конечно же, это было 8. Я думал, что это все, это просто повторяется по длине указателя, поэтому было бы разумно, что он напечатал Bazinga 8 раз. Мне также стало ясно, почему они используют Bazinga в качестве строки для печати - данные в массиве должны были быть просто отвлечением. Поэтому я попытался добавить больше данных в массив, и, конечно же, он продолжал печатать 8 раз. Затем я изменил первый номер массива, -1, чтобы проверить, действительно ли данные были бессмысленными или нет, и именно здесь я был в замешательстве. Он больше не печатался 8 раз, а только один раз. Разумеется, данные в массиве были не просто приманкой, но и для жизни я не мог понять, что происходит.
Функция указывает значения int (4 байта) с указателем char, которые указывают символы (1 байт) ..... – LPs
Добавить 'printf ("% 08X -% 08X -% 08X \ n ", data [0 ], данные [1], данные [2]); 'перед вызовом функции и увидеть результат ... – LPs
Не вызывает ли это неопределенное поведение? – George