我对C编程很陌生并且有疑问......我被要求在C代码的某些部分找到错误...而且这段我有点困惑所以会很感激帮助......
int main(void)
{
int myInt = 5;
printf("myInt = %d");
return 0;
}
据我所知,此代码没有任何问题。我想知道的是为什么这个陈述打印出一个随机数?
我得到的输出是
myInt = 1252057154
非常感谢帮助...谢谢
答案 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从堆栈中获取“第二个参数”,并且因为只有一个参数被推送到堆栈(字符串),所以它使用返回地址作为第二个参数。