C语言动态数组创建及猜数记录存储实现疑问
C语言动态数组存储猜数游戏记录的实现方案
不用每次猜错就创建新的动态数组——这种做法不仅效率低,还容易引发内存泄漏。正确的思路是维护一个可动态扩容的数组,每次猜错时直接扩容现有数组并添加新的猜测记录即可。下面是具体实现步骤:
1. 定义猜测记录的存储结构
每个猜测是6个数字,用结构体封装会更清晰,方便后续管理:
typedef struct { int numbers[6]; // 存储单次猜测的6个数字 } Guess;
2. 初始化动态数组
先分配一块初始容量的内存(比如先存4次猜测),同时记录当前已存储的猜测数量和数组总容量:
#include <stdio.h> #include <stdlib.h> int main() { Guess *guesses = malloc(4 * sizeof(Guess)); // 初始容量4 int guess_count = 0; // 已存储的猜测数 int guess_capacity = 4; // 当前数组总容量 // 游戏逻辑... }
3. 猜错时的扩容与记录存储
每次用户猜错后,先检查数组是否已满,满了就用realloc扩容(通常把容量翻倍,保证高效扩容),再把新的猜测存入数组:
// 假设user_numbers是读取到的用户输入的6个数字 if (guess_count == guess_capacity) { // 扩容:容量翻倍 guess_capacity *= 2; Guess *temp_ptr = realloc(guesses, guess_capacity * sizeof(Guess)); if (temp_ptr == NULL) { // 处理内存分配失败,必须先释放原有内存再退出 fprintf(stderr, "内存分配失败,程序终止\n"); free(guesses); exit(1); } guesses = temp_ptr; } // 存储当前猜测 for (int i = 0; i < 6; i++) { guesses[guess_count].numbers[i] = user_numbers[i]; } guess_count++;
4. 游戏结束后的内存清理
当用户猜对答案、游戏结束时,一定要释放动态数组占用的内存,避免内存泄漏:
free(guesses);
关键注意事项
- 绝对不要每次新建数组:每次新建数组都需要手动复制旧数据,还容易忘记释放旧数组的内存,导致内存泄漏。
realloc必须用临时变量接收返回值:如果内存分配失败,realloc会返回NULL,直接赋值会丢失原有数组的指针,导致内存无法释放。- 初始容量不用过大:选择一个合理的初始值(如4、8),后续翻倍扩容是平衡性能和内存占用的常用策略。
- 也可以用二维int数组:如果不想用结构体,也可以用
int** guesses来实现二维动态数组,但结构体的可读性和维护性更好。
内容的提问来源于stack exchange,提问作者BBB_TOAD
相关产品推荐
相关产品推荐

