C printf печать случайного числа - PullRequest
0 голосов
/ 13 марта 2012

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

int main(void)     
{
    int myInt = 5;
    printf("myInt = %d");
    return 0;
}

Насколько я понимаю, в этом коде нет ничего плохого.То, что я хочу знать, это то, почему это утверждение печатает случайное число ??

Вывод, который я получаю

myInt = 1252057154

Буду признателен за помощь ... Спасибо

Ответы [ 6 ]

6 голосов
/ 13 марта 2012

Вы должны прочитать больше о C программировании.

И вы должны включить все предупреждения и отладку при компиляции. С GCC это означает gcc -Wall -Wextra -g (по крайней мере, в Linux).

При компиляции с

gcc -Wall -Wextra -g john.c -o john

Я получаю следующие предупреждения:

john.c: In function ‘main’:
john.c:4:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
john.c:4:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
john.c:4:5: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat]
john.c:3:9: warning: unused variable ‘myInt’ [-Wunused-variable]

Итак, поправка проста:

/* file john.c */
#include <stdio.h>
int main(void)     
{
  int myInt = 5;
  printf("myInt = %d\n", myInt);
  return 0;
}

, который компилируется без предупреждений.

Обратите внимание на \n в конце строки формата printf. Это важно.

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

и научитесь использовать отладчик (например, gdb в Linux).

Наблюдаемое вами поведение неопределенное поведение ; что-либо может произойти с реализацией, соответствующей стандарту из C (даже взрыв).

Счастливого взлома.

4 голосов
/ 13 марта 2012

printf (и аналогично scanf) работает следующим образом:

Допустим, вы вызываете printf

printf("%d some text %f %u %hu some more text\n", arg1, arg2, arg3, arg4)

printf, перебираете строку формата и заменяете%? с аргументом, основанным на ?

%d some text %f %u %hu some more text
 |           |   |  |
arg1       arg2  |  arg4
                arg3

Теперь с функциями, принимающими переменное количество аргументов, они не знают, существуют ли аргументы, поэтому они просто берут данныеиз определенной части стека на основе строки формата.Если вы напишите:

printf("%d %f %u\n");

, он считывает три несуществующих данных из стека, наиболее вероятно, получит значения, сохраненные при вызове функции (значения, которые должны быть скрыты от вас)

2 голосов
/ 13 марта 2012

Ну, если он печатает что-то не так, проблема в printf вызове:

printf("myInt = %d");

Какие аргументы вы ожидаете передать?

2 голосов
/ 13 марта 2012

Должно быть так:

printf("myInt = %d",myInt);

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

0 голосов
/ 13 марта 2012

printf - это функция, которая получает один или несколько аргументов. В вашем случае он получил только один аргумент (который является допустимым), но аргумент содержит% d, который указывает printf принять второй аргумент вместо% d. printf берет «второй аргумент» из стека, и поскольку в стек (строку) помещается только один аргумент, он использует адрес возврата в качестве второго аргумента.

0 голосов
/ 13 марта 2012
int main(void)     
{
    int myInt = 5;
    printf("myInt = %d",myInt);
    return 0;
}

Единственное изменение в коде - это то, что я добавил переменную myInt в оператор printf, если вы видите в конце. Когда переменной присваивается какое-либо значение, ее можно отобразить, только передав ее в функцию printf () с соответствующим типом спецификатор. Это правило на языке C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...