具有大输入的分段错误

时间:2014-04-01 22:57:20

标签: c++ segmentation-fault

所以我用C ++编写了这个程序来解决COJ(Caribbean Online Judge)问题1456. http://coj.uci.cu/24h/problem.xhtml?abb=1456。它可以很好地处理示例输入和我编写的其他一些文件来测试它,但我一直得到'错误答案'作为一个判断,所以我决定尝试使用更大的输入文件,我得到了Segmentation Fault:11。该文件长度为1000001,没有第一个整数,即要测试的输入数。我知道错误是由与内存相关的东西引起的,但我真的缺少更多的信息。希望任何人都可以提供帮助,这让我感到疯狂。我主要用Java编程,所以我真的不知道如何解决这个问题。 :(

#include <stdio.h>

int main(){

long singleton;
long N;

scanf("%ld",&N);
long arr [N];
bool sing [N];

for(int i = 0; i<N; i++){
    scanf("%ld",&arr[i]);
}

for(int j = 0; j<N; j++){   

    if(sing[j]==false){     

        for(int i = j+1; i<N; i++){

            if(arr[j]==arr[i]){
                sing[j]=true;
                sing[i]=true;
                break;
            }


        }
    }

    if(sing[j]==false){
        singleton = arr[j];
        break;
    }
}

printf("%ld\n", singleton);
}

3 个答案:

答案 0 :(得分:2)

如果您使用C语言编写,则应更改前几行:

#include <stdio.h>
#include <stdlib.h>

int main(void){

  long singleton;
  long N;

  printf("enter the number of values:\n");
  scanf("%ld",&N);

  long *arr;
  arr = malloc(N * sizeof *arr);
  if(arr == NULL) {
    // malloc failed: handle error gracefully
    // and exit
  }

这至少会为你的数组分配适量的内存。

更新请注意,您可以使用常规

访问这些元素
arr[ii] = 0;

就像你已经将数组声明为

一样
long arr[N];

(这对你不起作用)。

答案 1 :(得分:0)

为了使C ++正常运行,你必须说服标准委员会在语言中添加可变长度数组。 要使其有效C,您必须包含<stdbool.h>

可能你的VLA会破坏你的筹码,消耗高达4 * 1000001的字节。 (bool只增加了四分之一)除非你使用正确的编译器选项,否则可能太多了。

无论如何,你应该使用动态内存。

另外,没有初始化使用唱歌是不明智的。

BTW:编程挑战最简单的答案是:将数字读入数组(使用malloc分配),排序(qsort有效),输出第一个非重复数据。

答案 2 :(得分:0)

当您编写long arr[N];时,您的程序无法正常处理没有足够内存来存储此数组的情况。充其量,您可能会遇到段错误。

然而,对于long *arr = malloc( N * sizeof *arr );,如果没有足够的内存,那么您会找到arr == NULL,然后您的程序可以采取其他一些操作,例如正常退出,或者再次尝试使用较小的内容号。

这两个版本之间的另一个区别是从内存中分配内存。

在C(和C ++)中,有两个内存池可以分配变量:自动内存,免费商店。在编程术语中,这些有时被称为&#34;堆栈&#34;和&#34;堆&#34;分别。 long arr[N]使用自动区域,malloc使用免费商店。

您的编译器和/或操作系统组合决定了每个池中程序可用的内存量。通常情况下,免费商店可以访问&#34;大&#34;内存量,进程在操作系统上可能具有的最大可能性。但是,自动存储区域的大小可能有限,并且缺点是如果分配失败,那么您必须让您的进程终止或让您的进程失控。

有些系统使用一个大区域,自动区域从底部开始增长,免费商店分配从顶部开始增长,直到它们相遇。在这些系统上,你可能不会为你的long arr[N]耗尽内存,尽管同样的缺点仍然是当它用完时无法处理。

因此,您应该更喜欢使用免费商店购买任何可能是&#34;大&#34;。