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