我正在尝试使用指针和数组等学习C语言......但是我的代码不起作用。这段代码有什么问题?
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
int main(){
int *number = 0;
int i = 0;
int *random = 0;
int randomTry[100];
int *getRandomTry = 0;
int randomGenerator[100];
int *getRandomGenerator = 0;
srand (time(NULL));
*getRandomTry = randomTry[100];
*getRandomGenerator = randomGenerator[100];
do{
*random = rand() % 10;
getRandomGenerator = random;
printf("Choosing a number:\n\r");
for(i = 0; i < 30; i++){
printf("*");
Sleep(50);
}
printf("\n\r\n\rWell done, your time.");
printf("\n\r------------------------------");
printf("\n\rPick a number ( 0 to 10): ");
scanf("%d", number);
getRandomTry = number;
if(*number > 10){
printf("\n\rRemember, number only from (0 to 10)\n\r");
}
else{
if(number == random){
printf("\n\rYou choose right!");
printf("You entered theses numbers till the right answer");
for(i = 0; i < randomTry[i]; i++){
printf("%i", getRandomTry);
}
}
else{
printf("\n\rYou choose wrong, number: %d - random: %d\n\r", number, random);
Sleep(700);
system("cls");
}
}
}while(number != random);
getch();
return 0;
}
当我编译程序停止工作时,控制台中不会显示任何警告或注释。
我正在使用带有MinGw的notepad ++来编译这段代码。
答案 0 :(得分:3)
为NULL指针赋值是未定义的行为,例如(在您的代码中)。
int *getRandomTry = 0;
*getRandomTry = randomTry[100];
在两个计数上给出未定义的行为。第二个语句尝试检索不存在的randomTry[100]
的值(因为数组索引从零开始,randomTry
只有100个元素)。其次,它尝试将该值存储到NULL
指针寻址的位置。
对于未定义的行为,任何事情都可能发生。程序崩溃很常见,但不是唯一可能的结果。
因此,您需要了解数组索引的工作原理(从零开始,而不是一个)。在尝试通过指针设置或检索值之前,您需要确保所有指针指向有效的东西。
例如;
int x = 5;
int *getRandomTry = &x;
*getRandomTry = 42; // will change x
答案 1 :(得分:-1)
以下是指向整数的指针的正确声明,初始值为零:
int *random = 0;
以下语句将尝试将计算结果放在内存中指针随机的地址中。指着:
*random = rand() % 10;
因为&#39;随机&#39;被赋值为0,它指向内存位置为零,第二个语句将导致“未定义行为”,这意味着程序中接下来发生的事情不容易预测。在实践中,它很可能会以某种方式崩溃,因为您无法写入内存位置0。
如果代码是这样的:
int random = 0;
...
random = rand() % 10;
然后一切都会好起来的。如果代码是这样的话,它也会起作用:
int random_variable;
int *random = 0;
...
random = &random_variable;
...
*random = rand() % 10;
在最后一种情况下,&#39; random_variable&#39;最终会得到计算结果。
希望这有帮助。