Arrays I';我试图返回数组中两个最大的数字和I';我犯了分段错误 #包括 int main() { int n,i; int-arr[n]; int max1=0; int max2=0; //引入数组元素 printf(“输入n:”); scanf(“%d”和“&n”); 对于(i=0;i

Arrays I';我试图返回数组中两个最大的数字和I';我犯了分段错误 #包括 int main() { int n,i; int-arr[n]; int max1=0; int max2=0; //引入数组元素 printf(“输入n:”); scanf(“%d”和“&n”); 对于(i=0;i,arrays,c,Arrays,C,这个问题要求我读取一个一维数组,并找到这个数组中最大的两个数。我试图以一种效率较低的方式求解它,因此我将首先迭代整个数组以找到第一个最大值,然后再次迭代以找到第二个最大值。 我的错误是分段错误(内核转储),我不知道我哪里做错了。不允许在以下位置使用变量设置堆栈分配的数组: #include <stdio.h> int main () { int n, i; int arr[n]; int max1 = 0; int max2 = 0; // introduci

这个问题要求我读取一个一维数组,并找到这个数组中最大的两个数。我试图以一种效率较低的方式求解它,因此我将首先迭代整个数组以找到第一个最大值,然后再次迭代以找到第二个最大值。
我的错误是分段错误(内核转储),我不知道我哪里做错了。

不允许在以下位置使用变量设置堆栈分配的数组:

#include <stdio.h>

int main ()
{
  int n, i;
  int arr[n];
  int max1 = 0;
  int max2 = 0;

  // introducing array elements 
  printf ("Enter n: ");
  scanf ("%d", &n);
  for (i = 0; i < n; i++)
    {
      scanf ("%d", &arr[i]);
    }
    
  // calculating max1, largest number


  for (i = 0; i < n; i++)
    {
      if (arr[i] >= max1)
    max1 = arr[i];
    }

  printf ("The first maximum is %d\n", max1);


  // calculating max2, iterate the array again


  for (i = 0; i < n; i++)
    {
      if ((arr[i] >= max2) && (arr[i] != max1))
            max2 = arr[i];
    }

  printf ("The second max is %d", max2);
}
您可以这样做:

int arr[n];
基本上,数组的大小必须在编译时知道。 你也从来没有把n设为一个数字

编辑:这在现代c语言中显然是不正确的。你可以这样做。

应该是这样的

int arr[10] //or any number
编译器在代码中为n提供了一个任意的垃圾值,该值可能小于您的迭代次数


一、 但是,我怀疑我的代码在一些经典编译器中是否正常工作,因为他们希望您将所有声明放在顶部

intarr[n]=未定义的行为<代码>n
在那里没有确定的值。将该行移到
n
的扫描框下方。当编译器看到这一行时,您认为
n
的值是多少:
int arr[n]??由于
n
在声明点未定义,因此数组
a
的大小未定义。只需移动声明
inta[n]
到设置
n
scanf
呼叫下方。谢谢!真是愚蠢的错误。允许使用可变大小的数组。问题不在于声明。如果是,代码甚至不会编译。问题是
n
在声明时未定义。声明只需向下移动到设置
n
scanf
下面。我认为编译器必须知道数组的大小。在C的旧版本中,我实际上只做C++,我不知道C是否相同。在现代ANSI C中,情况并非如此。再一次:代码编译。这立刻告诉你你的假设是错误的。在不支持可变大小数组的旧版本C中,这将是一个致命的编译错误。你自己试试看。请注意,数组的大小是由声明点处的
n
值决定的。请查看主帖子上的注释。他们都解释了这个问题,事实上OP立即理解并纠正了它。这个答案只是在传播错误信息,这是不幸的(投票人现在显然有错误的理解)。当然,它在编译时不知道数量。大小可能因呼叫而异。一旦知道数组有多大,它就会动态调整堆栈指针,为数组腾出空间。这是唯一可行的方法。当数组超出范围时,堆栈将再次调整以回收空间。
#include <stdio.h>

int main ()
{
  int n, i;
  
  int max1 = 0;
  int max2 = 0;
  
  printf ("Enter n: ");
  scanf ("%d", &n);
  int arr[n];

  // introducing array elements 
  
  for (i = 0; i < n; i++)
    {
      scanf ("%d", &arr[i]);
    }
    
  // calculating max1, largest number


  for (i = 0; i < n; i++)
    {
      if (arr[i] >= max1)
    max1 = arr[i];
    }

  printf ("The first maximum is %d\n", max1);


  // calculating max2, iterate the array again


  for (i = 0; i < n; i++)
    {
      if ((arr[i] >= max2) && (arr[i] != max1))
            max2 = arr[i];
    }

  printf ("The second max is %d", max2);
}
printf ("Enter n: ");
scanf ("%d", &n);
int arr[n];