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

C语言生成HashMap测试字符串时全部重复的问题排查

C语言生成HashMap字符串Key时所有Key相同的问题分析与解决

问题现象

测试自定义HashMap时,生成15个随机字符串Key的代码运行后,所有Key完全相同。原代码如下:

char* keys [15] = { 0 };

for (int i = 0; i < 15; i++)
{
    char key [7] = { 0 };
    for(int j = 0; j < 5; ++j)
    {
        int rand_char = rand()%26+'A';
        key[j] = (char)rand_char;
    }
    *(keys + i) = key; 
}

for (int i = 0; i < 15; i++)
    printf("%s\n", keys[i]); 

输出为15行相同的字符串(如MPAPQ)。调试时发现新字符生成时,所有已生成的Key会同步变化,所有指针仿佛指向同一个字符串。

问题原因

循环内定义的char key[7]是栈帧上的局部变量,它的内存空间属于当前循环迭代的栈帧。每次循环结束后,该栈帧被销毁,这块内存会被后续循环复用。你将key的地址赋值给keys数组中的指针,导致数组里所有指针都指向同一块栈内存地址。每次循环生成新字符串时,都是在修改这块共享内存,最终所有指针自然指向内存中最后一次写入的字符串。

解决方法

方法1:动态分配内存(推荐)

使用malloc为每个Key独立分配堆内存,这样每个Key的内存不会被循环复用,生命周期由你控制:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main() {
    // 初始化随机种子,避免每次运行生成相同序列
    srand(time(NULL));

    char* keys[15] = {0};

    for (int i = 0; i < 15; i++)
    {
        // 分配7字节内存:5个字符 + 2个预留(含终止符)
        char* key = malloc(7 * sizeof(char));
        if (key == NULL) {
            perror("malloc failed");
            // 释放已分配的内存,避免泄漏
            for (int k = 0; k < i; k++) {
                free(keys[k]);
            }
            return 1;
        }
        memset(key, 0, 7); // 初始化内存为0,确保终止符存在
        for(int j = 0; j < 5; ++j)
        {
            int rand_char = rand()%26+'A';
            key[j] = (char)rand_char;
        }
        keys[i] = key; 
    }

    // 打印测试
    for (int i = 0; i < 15; i++)
        printf("%s\n", keys[i]); 

    // 使用完毕后释放内存,避免泄漏
    for (int i = 0; i < 15; i++) {
        free(keys[i]);
    }

    return 0;
}

方法2:使用二维数组

直接定义二维数组,每个Key拥有独立的栈内存空间,无需手动管理内存:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand(time(NULL));

    char keys[15][7] = {0}; // 15个Key,每个占7字节

    for (int i = 0; i < 15; i++)
    {
        for(int j = 0; j < 5; ++j)
        {
            int rand_char = rand()%26+'A';
            keys[i][j] = (char)rand_char;
        }
    }

    for (int i = 0; i < 15; i++)
        printf("%s\n", keys[i]); 

    return 0;
}

额外提示

默认情况下rand()的种子是固定的,每次运行程序会生成相同的随机序列。建议在程序开头调用srand(time(NULL));,用当前时间作为随机种子,确保每次运行生成的Key不同。

内容的提问来源于stack exchange,提问作者Nemo Streams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:12:19