16位随机字符串生成函数执行到return语句时崩溃如何解决
问题诱因
- 直接崩溃的核心原因:你默认构造的
string code是空字符串,长度为0,没有分配任何存储字符的内存空间,直接通过code[i]赋值属于缓冲区越界的未定义行为。越界写入会破坏std::string内部存储的堆内存元数据,当函数返回需要析构局部code变量时,操作系统检测到堆内存结构被破坏,就会在return阶段触发崩溃。 - 隐藏问题:
srand(time(NULL))放在函数内部,每次调用该函数都会重新用当前时间播种随机数,若短时间多次调用函数会生成完全相同的字符串;rand()%62的取模方式也存在随机数分布不均的小问题,但这两个都不是本次崩溃的直接诱因。
修复方案
有两种常用的修复写法:
写法1:预分配字符串长度
string random() { // 预先分配16位长度的存储空间,避免后续越界访问 string code(16, '\0'); int i; for (i = 0; i < 16; i++) { code[i] = alphanumeric((rand() % 62)); } return code; }
写法2:用push_back追加字符
string random() { string code; // 提前预留16位空间避免动态扩容开销,可选但推荐 code.reserve(16); int i; for (i = 0; i < 16; i++) { code.push_back(alphanumeric((rand() % 62))); } return code; }
额外优化建议:将
srand(time(NULL))移到main函数启动时执行一次即可,不需要每次调用随机生成函数都重复播种。
内容的提问来源于stack exchange,提问作者dekaottoman
相关产品推荐
相关产品推荐

