数组的奇怪行为
strange behavior with array
这是我的代码,它在 运行 时间内不起作用(在 java 内工作正常)。
但是如果我换行
primeNumber[size] = counter;
为
primeNumber[i] = counter;
程序不会在 运行 时间内崩溃。有人知道为什么 C 不接受那个命令 primeNumber[size] = counter;
谢谢!
#include <stdio.h>
int main(void){
int primeNumber[90];
primeNumber[0] = 2; //start with 2
int size = 1;
int divisible = 0;
int i = 0;
int counter = 3;
while(counter <= 100){
divisible = 0;
for(i = 0; i <= size; i++){
if(counter%primeNumber[i] == 0){
divisible++;
break;
}
}
if(divisible == 0){
primeNumber[size] = counter;
size = size + 1;
}
counter++;
}
for(i = 0; i <= size; i++){
printf("\n prime: %d", primeNumber[i]);
}
return 0;
}
这只是一个差一错误。相关点在下面的代码中注释。
#include <stdio.h>
int main(void){
int primeNumber[90];
primeNumber[0] = 2; //start with 2
int size = 1;
int divisible = 0;
int i = 0;
int counter = 3;
while(counter <= 100){
divisible = 0;
for(i = 0; i < size; i++){ // Was error here
if(counter%primeNumber[i] == 0){
divisible++;
break;
}
}
if(divisible == 0){
primeNumber[size] = counter;
size = size + 1;
}
counter++;
}
for(i = 0; i < size; i++){ // Was error here
printf("\n prime: %d", primeNumber[i]);
}
return 0;
}
打印:
prime: 2
prime: 3
prime: 5
prime: 7
prime: 11
prime: 13
prime: 17
prime: 19
prime: 23
prime: 29
prime: 31
prime: 37
prime: 41
prime: 43
prime: 47
prime: 53
prime: 59
prime: 61
prime: 67
prime: 71
prime: 73
prime: 79
prime: 83
prime: 89
prime: 97
您在初始值为 size
的 for
循环中出错。由于您使用 i <= size
,因此 i
在第二次迭代期间达到 1
,并且 primeNumber[1]
未初始化。请改用 i < size
。
你在最后一个 for
中有同样的问题(使用 printf),因为你在 primeNumber
中更改值后增加 size
,primeNumber[size]
不会'尚未初始化。
注意:由于这个错误,您的代码应该只是有异常行为,而不是崩溃。
size 的值增长到 98,而 array 的大小是 90,所以将大小增加到 100,它会解决你的问题。
#include <stdio.h>
int main(void){
int primeNumber[100]; //increased size to 100
primeNumber[0] = 2; //start with 2
int size = 1;
int divisible = 0;
int i = 0;
int counter = 3;
while(counter <= 100){
divisible = 0;
//replaced <= with < to avoid floating point exception
for(i = 0; i < size; i++){
if(counter % primeNumber[i] == 0){
divisible++;
break;
}
}
if(divisible == 0){
primeNumber[size] = counter;
size = size + 1;
}
counter++;
}
for(i = 0; i <= size; i++){
printf("\n prime: %d", primeNumber[i]);
}
return 0;
}
这是我的代码,它在 运行 时间内不起作用(在 java 内工作正常)。
但是如果我换行
primeNumber[size] = counter;
为
primeNumber[i] = counter;
程序不会在 运行 时间内崩溃。有人知道为什么 C 不接受那个命令 primeNumber[size] = counter;
谢谢!
#include <stdio.h>
int main(void){
int primeNumber[90];
primeNumber[0] = 2; //start with 2
int size = 1;
int divisible = 0;
int i = 0;
int counter = 3;
while(counter <= 100){
divisible = 0;
for(i = 0; i <= size; i++){
if(counter%primeNumber[i] == 0){
divisible++;
break;
}
}
if(divisible == 0){
primeNumber[size] = counter;
size = size + 1;
}
counter++;
}
for(i = 0; i <= size; i++){
printf("\n prime: %d", primeNumber[i]);
}
return 0;
}
这只是一个差一错误。相关点在下面的代码中注释。
#include <stdio.h>
int main(void){
int primeNumber[90];
primeNumber[0] = 2; //start with 2
int size = 1;
int divisible = 0;
int i = 0;
int counter = 3;
while(counter <= 100){
divisible = 0;
for(i = 0; i < size; i++){ // Was error here
if(counter%primeNumber[i] == 0){
divisible++;
break;
}
}
if(divisible == 0){
primeNumber[size] = counter;
size = size + 1;
}
counter++;
}
for(i = 0; i < size; i++){ // Was error here
printf("\n prime: %d", primeNumber[i]);
}
return 0;
}
打印:
prime: 2
prime: 3
prime: 5
prime: 7
prime: 11
prime: 13
prime: 17
prime: 19
prime: 23
prime: 29
prime: 31
prime: 37
prime: 41
prime: 43
prime: 47
prime: 53
prime: 59
prime: 61
prime: 67
prime: 71
prime: 73
prime: 79
prime: 83
prime: 89
prime: 97
您在初始值为 size
的 for
循环中出错。由于您使用 i <= size
,因此 i
在第二次迭代期间达到 1
,并且 primeNumber[1]
未初始化。请改用 i < size
。
你在最后一个 for
中有同样的问题(使用 printf),因为你在 primeNumber
中更改值后增加 size
,primeNumber[size]
不会'尚未初始化。
注意:由于这个错误,您的代码应该只是有异常行为,而不是崩溃。
size 的值增长到 98,而 array 的大小是 90,所以将大小增加到 100,它会解决你的问题。
#include <stdio.h>
int main(void){
int primeNumber[100]; //increased size to 100
primeNumber[0] = 2; //start with 2
int size = 1;
int divisible = 0;
int i = 0;
int counter = 3;
while(counter <= 100){
divisible = 0;
//replaced <= with < to avoid floating point exception
for(i = 0; i < size; i++){
if(counter % primeNumber[i] == 0){
divisible++;
break;
}
}
if(divisible == 0){
primeNumber[size] = counter;
size = size + 1;
}
counter++;
}
for(i = 0; i <= size; i++){
printf("\n prime: %d", primeNumber[i]);
}
return 0;
}