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
相关产品推荐
相关产品推荐

