В последнее время я пытаюсь проработать некоторые основы C, чтобы попытаться создать базовое понимание языков более низкого уровня. В одном из документов, с которыми я столкнулся (A tutorial on pointers and arrays in C) автор использует указатель недействительным в printf
заявлении:Указатель на удаление при печати
int var = 2;
printf("var has the value %d and is stored at %p\n", var, (void *) &var);
И утверждает причину:
Я ввергнуть указатели на целые числа в void Указатели, чтобы сделать их совместимыми со спецификацией преобразования% p.
Однако, опуская (void *)
не приводит к ошибке или предупреждение, либо компиляции и выполнения или через valgrind
.
int var = 2;
printf("var has the value %d and is stored at %p\n", var, &var);
Является ли кастинг недействительным здесь считается лучшей практикой или стандартом, или есть что-то более зловещее?
Невозможно проверить экспериментально, правильно ли вы написали C. Программа правильная C, если она соответствует правилам, это все, что вы можете сделать. –
Это просто явное выражение, буквально говорит: «Я беру эту ценность, чтобы ее толковали именно так». В вашем примере вы используете 'int *' для 'void *'. Поэтому возьмите мой целочисленный указатель, чтобы интерпретировать его как общий указатель. Лично, быть настолько многословным, не кажется большой практикой для подобных тривиальных ситуаций. – SGM1
Указателям на разные типы разрешено иметь разные представления и ограничения выравнивания. 'printf()' - это вариационная функция, которая автоматически не преобразует свои аргументы в тип своих параметров, поэтому вызов его с аргументами неправильного типа приводит к неопределенному поведению. – EOF