[英]Program crashes on large inputs (C)
請看一下這個C代碼。 這是我編寫的一個小程序,它以數字n為輸入,並計算2到n之間的所有素數。 當n <100時,它可以正常工作,但是如果我輸入1000或更多,它會崩潰。 我不知道為什么,因為存儲數字的數組是動態分配的,所以內存不足應該不是問題。
那么,為什么程序在大輸入時崩潰?
另外,對於代碼的可讀性不好,我深表歉意。 我只是從編程開始。
碼
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int n;
int *array = malloc((n-1)*sizeof array);
int q = 0;
int k;
int *array2;
printf("Geben Sie eine natuerliche Zahl n ein: ");
scanf("%d", &n);
printf("\n");
for(i=0; i<=n-2; i++){
array[i] = i+2;
}
while(q<=n-2){
while(array[q]==0&&q<=n-2){
q++;
}
for(i=q+1; i<=n-2; i++){
if(array[i]%array[q]==0){
array[i] = 0;
}
}
q++;
}
PART1:
for(i=0; array[i]!=0; i++){
if(array[i+1]==0){
int j;
for(j=i+1; j<=n-2; j++){
if(array[j]!=0){
array[i+1] = array[j];
array[j] = 0;
goto PART1;
}
}
k = i;
goto PART2;
}
}
PART2:
*array2 = malloc((k+1)*sizeof array2);
for(i=0; i<=k; i++){
array2[i]=array[i]; //Here's where the program crashes
}
free(array);
for(i=0; i<k; i++){
printf("%d ,", array2[i]);
}
printf("%d\n\n", array2[k]);
free(array2);
return 0;
}
代碼塊調試器說:程序在第53行收到信號SIGSEGV,分段錯誤。我在代碼中標記了它。
修復過程
在這種情況下,第53行指的是未正確分配的array2
訪問。
需要更改
- 在scanf正確分配n之后,移動array1的分配
- 更改之前分配malloc返回的array2的分配,返回指針array2的內容,而不是array2(在此階段也未分配)指針
- 調整分配以使用@alk標識的
sizeof(*array1+2)
調整后的代碼
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i, n, q = 0, k, *array2;
printf("Geben Sie eine natuerliche Zahl n ein: ");
scanf("%d", &n);
int *array = malloc((n-1)*sizeof(*array));
printf("\n");
for(i=0; i<=n-2; i++){
array[i] = i+2;
}
while(q<=n-2){
while(array[q]==0&&q<=n-2){
q++;
}
for(i=q+1; i<=n-2; i++){
if(array[i]%array[q]==0){
array[i] = 0;
}
}
q++;
}
PART1:
for(i=0; array[i]!=0; i++){
if(array[i+1]==0){
int j;
for(j=i+1; j<=n-2; j++){
if(array[j]!=0){
array[i+1] = array[j];
array[j] = 0;
goto PART1;
}
}
k = i;
goto PART2;
}
}
PART2:
array2 = malloc((k+1)*sizeof(*array2));
for(i=0; i<=k; i++){
array2[i]=array[i]; //Here's where the program crashes
}
free(array);
for(i=0; i<k; i++){
printf("%d ,", array2[i]);
}
printf("%d\n\n", array2[k]);
free(array2);
return 0;
}
另請參見本文有關在c中實現sieve of erastothenes
文章。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.