2017-02-08 12 views
-1

У меня есть этот код:"% р" Printf параметр

#include <stdio.h> 
#include <string.h> 

void main(){ 
     printf("%p"); 
} 

Это выход: 0x7ffdd9b973d8

Я знаю %p стенды для указателя и при использовании его в качестве, например

#include <stdio.h> 
#include <string.h> 

void main(){ 
int i = 0; 
printf("%p", i); 
} 

возвращает адрес указателя i. Но мой вопрос, что же он вернется, когда не добавляя какой-либо другой аргумент в функции PRINTF просто printf("%p")

+9

'printf ("% p ", i);' не печатает адрес 'i'. Вам понадобится 'printf («% p », (void *) &i);' для этого. – AnT

+1

Я думаю, что это просто случайный адрес в памяти. Ну, не случайный, как в сгенерированном, но не предсказуемом напрямую. В основном мусор – Cullub

+2

@ ant, вам нужен '(void *)', хотя? – Cullub

ответ

4

Корзина. printf использует список аргументов переменной длины. Он использует строку формата, чтобы определить, сколько аргументов вы фактически передали. Если вы на самом деле ничего не пропускали, он все равно будет читать из практически произвольных частей памяти, как если бы вы это делали. Результат не определен/мусор.

Некоторые компиляторы смогут обнаружить эту ситуацию с предупреждением, потому что семейство функций printf так популярен. В некоторых случаях может произойти сбой вашей системы, если функция пытается прочитать из памяти, к которой у вас нет доступа. Невозможно сказать, как он будет вести себя в следующий раз, даже если вы получили определенный результат.

4

Поведение

printf("%p"); 

не определена. Когда вы указываете формат %p в строке формата, соответствующий аргумент типа void * (или char *) должен присутствовать в списке аргументов.

+1

Я думаю, что OP просит, как это правило применяется, если вообще. –

+0

MadPhysicist IS прав. –

+0

@Mad Физик: Я этого не вижу. Вопрос в том, что речь идет о печатном мусоре и откуда он идет. – AnT

4

Но мой вопрос в том, что он возвращает, когда не добавляет какой-либо другой аргумент в функцию printf только printf ("% p");

Ничего. Ничего. Случайный мусор. Может быть, он падает.

Невозможно узнать, не исследуя конкретную комбинацию компилятора, процессора, платформы, библиотек, среды выполнения и т. Д. Нет правила, которое требует, чтобы он работал каким-либо определенным образом.

 Смежные вопросы

  • Нет связанных вопросов^_^