我今天在辅导一些 C 编程语言类(class)的学生时遇到了这段代码。 该练习要求实现两个功能。第一个扫描用户的输入,第二个显示之前扫描过的内容。 我遇到的代码如下:
#include <stdio.h>
void myInput(int i,int n)
{
int cpt;
int tab[n];
for ( cpt=0; cpt<n; cpt++)
{
printf("Enter a number :");
scanf("%d",&i);
tab[cpt]=i;
}
}
void myDisp (int n)
{
int tab[n];
int cpt;
for ( cpt=0; cpt <n; cpt++)
{
printf("%d ", tab[cpt]);
}
}
int main()
{
int n; int i;
printf(" Entrer the numbers of elements you want: \n");
scanf("%d \n",&n);
int tab[n];
myInput(i,n);
myDisp(n);
}
虽然这段代码充满了矛盾,但它确实在 gcc 4.4.3 下工作:它显示了已经输入的数字!!!!!!! 有谁知道这些代码是如何工作的?
非常感谢
最佳答案
如果这可行,那完全是运气不好。 myDisp
中打印的是未初始化的堆栈,它可能包含也可能不包含在 myInput
中放入类似命名变量的数据。 Related reading
这里有一个用什么都不做的代码来打破它的简单方法:
void myInput(int i,int n)
{
// Add some variables to mess up the stack positioning.
int breaker;
int cpt;
int stomper;
int tab[n];
int smasher;
for ( cpt=0; cpt<n; cpt++)
{
printf("Enter a number :");
scanf("%d",&i);
tab[cpt]=i;
}
// Trick the compiler into thinking these variables do something.
breaker = 1;
smasher = 3 * breaker;
stomper = smasher + breaker;
breaker = stomper * smasher;
}
另一种打破它的方法是在对 myInput
和 myDisp
的调用之间放置一个函数调用(例如,对 printf
)。
关于c - gcc 4.4.3 下 C 代码中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347836/