无法找出我的代码中的这部分代码在C中崩溃的原因

时间:2016-01-24 19:30:58

标签: c algorithm

我确信这很简单,但我似乎无法找到我的代码崩溃的原因。这是我的程序的开始,它已经崩溃。它是使用eratosthenes(或部分)的筛子找到素数。

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

int main(){
    int i, j, k;

    int *array = malloc(sizeof(int)*1500000);
    int *temp = malloc(sizeof(int)*10000);

/***** step 1 : find prime numbers *****/

    // initialize array to zero
    for(i=0; i<1500000; i++)
        array[i] = 0;

    // sieve algorithm
    for(i=2; i<1500000; i++)
        if(array[i] == 0){
            j = i;
            k = 0;
            while(k<1500000){
                k = i*j;
                array[k] = 1;
                j = j + 1;
            }
        }
    free(array);
    free(temp);
    return 0;
}

更换:

            k = 0;
            while(k<1500000){
                k = i*j;
                array[k] = 1;
                j = j + 1;
            }

使用:

            while(i*j<1500000){
                array[i*j] = 1;
                j = j + 1;
            }

无法解决所有问题。为什么呢?

3 个答案:

答案 0 :(得分:2)

问题在于:

        k = 0;
        while (k<1500000){
            k = i*j;
            array[k] = 1; /* error line */
            j = j + 1;
        }

这里,数组的索引k可以是&gt;数组的大小,因此你得到一个越界错误。

在你的代码中我可能是1499999而k也可能是1499999. 1499999 * 1499999 = 2249997000001.实际上结果可能会溢出,这可能不是你想要的。

总是一个好主意,逐步检查逻辑。编程就像数学 - 检查你的逻辑。

您还可以使用调试器来逐步执行代码。虽然在这种情况下可能需要一段时间!或者至少你可以在调试模式下运行它会在你得到异常时停止,你可以在那时检查变量。

答案 1 :(得分:0)

它可能会崩溃,因为它实际上无法为您分配n_bytes。因此,您应该检查对malloc的调用:

if(array == NULL)
{
puts("ERROR : Can't allocate memory");
return 1;
}

此外,如果您希望使用全0值初始化数组,可以使用calloc:

void *calloc(size_t nitems, size_t size)

据男人说:

  

calloc()函数为nmemb数组分配内存   每个大小字节的元素,并返回指向allo-的指针          内存记忆。内存设置为零。如果nmemb或size为0,则calloc()返回NULL或唯一指针          以后可以成功传递给free()的值。

您实际上也可以使用memset函数执行此操作:

void *memset(void *str, int c, size_t n)

答案 2 :(得分:0)

将此行更改为使用无符号整数

c += 1

到这个

int i, j, k;

当你将有符号的整数相乘然后进行比较时,你会冒整数为负的风险,即

size_t i, j, k;

所以你的测试失败了。