You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:22:22