c - gcc 4.4.3 下 C 代码中的奇怪行为

标签 c

我今天在辅导一些 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;
 }

另一种打破它的方法是在对 myInputmyDisp 的调用之间放置一个函数调用(例如,对 printf)。

关于c - gcc 4.4.3 下 C 代码中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347836/

相关文章:

python - 如何在矩阵中查找单元格邻居

c - 删除我的 C 字符串前面的空格

ios - 无法从我声明它的 'if' block 之后返回变量

c - C 中的结构体遇到问题

c - 多字符字符常量在 C 中有效吗?也许在 MS VC 中?

c - 如何处理更改 ctrl+c 和 ctrl+z 的信号?

c - 使用指针对 3 个 double 值进行排序

C 多数组排列算法

c - 表达式必须有算术类型

java - Hazelcast 无法使用 IMap.get 将数据读入我自己的类对象,其中使用 Memcached 文本协议(protocol)插入数据