C printf打印随机数

时间:2012-03-13 13:26:41

标签: c printf

我对C编程很陌生并且有疑问......我被要求在C代码的某些部分找到错误...而且这段我有点困惑所以会很感激帮助......

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

据我所知,此代码没有任何问题。我想知道的是为什么这个陈述打印出一个随机数?

我得到的输出是

myInt = 1252057154

非常感谢帮助...谢谢

6 个答案:

答案 0 :(得分:6)

您应该阅读有关 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。这很重要。

始终启用编译器可以提供的所有警告并信任编译器,因此请更正代码,直到没有警告为止。

学会使用调试器(例如Linux上的gdb)。

您观察到的行为是未定义的行为; C 标准符合实现(即使是爆炸)也可能发生任何

快乐的黑客攻击。

答案 1 :(得分:3)

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 :(得分:2)

应该是这样的:

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

如果你不包含变量,那么它基本上会拉入一块随机的内存。此外,如果用更大的代码块执行此操作,可能会导致更多奇怪的事情发生。始终确保您根据需要从printf语句中获得尽可能多的变量,否则将导致不良内容。

答案 3 :(得分:2)

好吧,如果它打印错误,则问题出在printf来电:

printf("myInt = %d");

您希望通过哪些论点?

答案 4 :(得分:0)

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

代码中唯一的变化是我在printf语句中添加了myInt变量,如果你在最后看到的那样。无论何时为变量赋值,只能通过将其传递给具有相应类型的printf()函数来显示它。说明符。它是C中的规则。

答案 5 :(得分:0)

printf是一个接收一个或多个参数的函数。 在你的情况下,它只收到一个参数(这是合法的)但参数包含%d,它告诉printf采用第二个参数而不是%d。 printf从堆栈中获取“第二个参数”,并且因为只有一个参数被推送到堆栈(字符串),所以它使用返回地址作为第二个参数。