我确信这很简单,但我似乎无法找到我的代码崩溃的原因。这是我的程序的开始,它已经崩溃。它是使用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;
}
无法解决所有问题。为什么呢?
答案 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;
所以你的测试失败了。