2015-09-13 3 views
-4

Я изучаю C на данный момент и решил немного поэкспериментировать с указателями. Я скомпилировать и выполнить следующий код:C: странное поведение printf

int main() 
{ 
    float a = 8; 
    int *b, *c; 
    b = &a; 
    c = &b; 
    printf("%d\n%d\n%d\n", a, b, c); 

    exit(0); 
} 

Выполнение кода дает:

-562800092 
-562800104 
0 

Теперь я знаю, что я пытаюсь напечатать поплавок в виде целого числа. Когда я печатаю его с помощью float, я получаю желаемый результат (поплавок и 2 адреса памяти).

Если я печатаю его (неправильно) как целое число, он, кажется, печатает адрес памяти как. b печатается как другой адрес памяти (что является правильным, так как это адрес), а c по какой-то причине 0. Похоже, что printf фактически меняет некоторые данные.

Может ли кто-нибудь объяснить, что здесь происходит?

Я использую GCC как компилятор кстати.

+4

Если вы напечатаете данные «неправильно», это будет неверно. Конец истории! –

+2

Сколько предупреждений было там? и сколько вы проигнорировали? –

ответ

0

Ints, поплавки и указатели не обязательно имеют одинаковый размер в стеке. Поскольку% d ожидает int, он просто занимает столько же байтов, сколько в int из стека, поэтому вы не будете обязательно печатать то, что ожидаете напечатать, если ожидаемые размеры элементов в строке формата не совпадают размеры аргументов, которые вы предоставляете printf.

+0

Это могло быть, спасибо! –

0

Тип указателя должен быть float* вместо int*.

Если вы хотите указать адрес, используйте %p.

Таким образом, в результате программа являются:

float a = 8; 
float *b, *c; 
b = &a; 
c = &b; 
printf("%f\n%p\n%p\n", a, b, c); 

exit(0); 

Он выводит:

8.000000 
e0c70eb4 
e0c70eb8 

Является ли это то, что вы хотите? (Вы можете распечатать *b и *(float*)(*c), оба должны быть 8.0)

+3

Правильный спецификатор формата для указателей - '% p', а не'% x'. –

+0

@YuHao Большое спасибо! Ред. – maowtm

+0

Это не совсем то, чем я был, думаю. Я не ищу правильный способ его печати. ​​Мне интересно, почему printf, похоже, меняет две другие вещи, которые я хочу напечатать, когда я даю неправильный тип первому. Даже если я использую float * b, * c и% x, c все еще печатается как 0, хотя он должен быть указателем на b. –

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