C语言指针问题:猜数字游戏输出所有猜测值均为0
问题分析与修复
核心问题出在打印猜测记录的循环中:你使用了p[arr_size]作为访问下标,而arr_size是数组的总长度,数组的合法下标范围是0到arr_size-1。p[arr_size]指向的是数组末尾之外的未初始化内存,所以输出的是随机值(这里显示为0)。
修复步骤
1. 修正打印循环的下标
把打印循环里的p[arr_size]改为p[i],同时优化输出格式避免末尾多余的逗号:
printf("Your Tries: "); for(int i = 0; i < arr_size; i ++){ printf("%d", p[i]); if(i != arr_size - 1){ printf(", "); } } printf("\n");
2. 调整-1输入的判断位置
当前代码会把-1也存入数组,但输入-1是用户主动放弃,不应算作有效尝试。需要把guess == -1的判断移到存储猜测值之前:
while(1){ int guess; scanf("%d", &guess); if(guess == -1){ printf("You input wrong number\nYou lose. The Number is %d\n", n); break; } arr_size ++; p = realloc(p, sizeof(int) * arr_size); p[arr_size-1] = guess; // 后续的大小判断逻辑... }
3. 优化初始内存分配
初始时arr_size为0,直接用NULL初始化指针更规范,因为realloc(NULL, size)等价于malloc(size):
int *p = NULL; // 替代原来的malloc(sizeof(int)*arr_size)
4. 释放内存避免泄漏
程序结束前记得释放分配的内存:
free(p); return 0;
完整修正后的代码
#include <time.h> #include <stdlib.h> #include <stdio.h> int arr_size = 0; int main() { srand(2022); int n = (rand() % 100) + 1; int *p = NULL; while(1){ int guess; scanf("%d", &guess); if(guess == -1){ printf("You input wrong number\nYou lose. The Number is %d\n", n); break; } arr_size ++; p = realloc(p, sizeof(int) * arr_size); p[arr_size-1] = guess; if(n > guess){ printf("The Number is greater than %d\n", guess); }else if(n < guess){ printf("The Number is less than %d\n", guess); }else{ printf("You win. The Number is %d\n", guess); break; } } printf("Your Tries: "); for(int i = 0; i < arr_size; i ++){ printf("%d", p[i]); if(i != arr_size - 1){ printf(", "); } } printf("\n"); free(p); return 0; }
内容的提问来源于stack exchange,提问作者Steven Oh
相关产品推荐
相关产品推荐

