[英]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.