C语言「寻找100000以内的所有素数」为啥这么写

在32位系统下,int型变量的上限是2147483647。sqrt(2147483647)约等于46340。当i\u0026gt;46340时,j=i*i;溢出,溢出后j可能为负数或特别大的数。然后循环开始,我们给mark赋值,而j是负数或者超过mark数组大小的数。这是未定义操作,便发生了错误。题主可以在18行后将j打印出来,会加深印象。
■网友
你在代码用了bool, 不加stdbool.h 头文件, gcc是编译不过的。这个是我在 求十亿内所有质数的和,怎么做最快? - 邓攀的回答 的回答随便改的。之所以用 bool *state = (bool *)malloc(sizeof(bool) * (MAX+1)); 开数组,是你把#define MAX 1000000000 也可以的。开超大数组建议用malloc 在堆上算, 不然你随时注意栈内存溢出。linux 栈内存是8M, 开int数组大概可以开200w,  堆就限制很少了。#include \u0026lt;stdio.h\u0026gt;#include \u0026lt;stdbool.h\u0026gt;#include \u0026lt;stdint.h\u0026gt;#include \u0026lt;stdlib.h\u0026gt; #include \u0026lt;math.h\u0026gt;#define MAX 100000 int main(){\tbool *state = (bool *)malloc(sizeof(bool) * (MAX+1)); //bool state;\tint64_t sq = sqrt(MAX); \tfor(int64_t i = 2; i\u0026lt;= sq; ++ i)\t{\t\tif(!state)\t\t{\t\t\tfor(int64_t j = i*i; j \u0026lt;= MAX; j += i) {\t\t\t\tstate = true;\t\t\t}\t\t}\t} \tint64_t num = 0;\tfor(int64_t i = 2; i \u0026lt;= MAX; ++ i)\t{\t\t\tif(!state) {\t\t\tnum ++;\t\t\t\t\t}\t}\tfree(state);//如果是 bool state; 就不要这句 \tprintf("the total num : %lld \", num);\tfor(int64_t i = 2; i \u0026lt;= MAX; ++ i)\t{\t\t\tif(!state) {\t\t\tprintf("%lld \", i)\t\t}\t}\treturn 0;}
■网友
很多回答指出了代码中的问题,但其实这个写法本身就很垃圾(那3个外部变量),根本不值得改。
■网友
吐槽一下,第17行的这个
if (i\u0026gt;=1000) continue;因为 C语言「寻找100000以内的所有素数」为啥这么写
,所以应该改成
if (i\u0026gt;=317) continue; 【C语言「寻找100000以内的所有素数」为啥这么写】 否则 j 会超出 mark 的取值范围,造成泄漏。

■网友
强制停止,否则会溢出报错
■网友
这是哪个ide,看起来很舒服啊。
■网友
1.出错时因为溢出2.添加17行正确是因为1000=sqrt(100000)
■网友
正确的写法是把i的循环上界改成i*i\u0026lt;=100000


    推荐阅读