繁体   English   中英

具有大输入的分段错误

[英]Segmentation Fault with big input

所以我用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);
}

如果你是用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];

(这对你不起作用)。

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

可能你的VLA核对你的堆栈,耗费高达4 * 1000001字节。 (bool只增加了四分之一)除非你使用正确的编译器选项,否则这可能太多了。

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

此外,使用唱歌而不进行初始化是不明智的。

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

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

但是,使用long *arr = malloc( N * sizeof *arr ); ,如果没有足够的内存,那么你会发现arr == NULL ,然后你的程序可以采取其他一些动作,例如优雅地退出,或者用较小的数字再次尝试。

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

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

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

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

因此,您应该更喜欢将免费商店用于任何可能“大”的商店。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM