我正在尝试使用找到的代码生成随机字母数字字符串here(下面重复的功能代码):
代码:
void gen_random(char *s, const int len) {
static const char alphanum[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
for (int i = 0; i < len; ++i) {
s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
}
s[len] = 0;
}
乍一看,这很有效。但是,当我调用该函数两次时,返回值将被覆盖。让我解释。当我使用代码时:
char image_id[32];
gen_random(image_id, 32); //image_id is correctly populated with a random string at this point.
char feature_id[32];
gen_random(feature_id, 32); //feature_id is correctly populated with a random string at this point. However, image_id is now an empty string?!?!?
image_id
变为空字符串。但是,如果我删除最后一行gen_random(feature_id, 32);
(或之前的断点),则会正确存储image_id
。
这怎么可能?我在这里缺少什么?
答案 0 :(得分:4)
我不确定这是否是造成问题的根本原因,但这是一个错误:在函数gen_random
内:
s[len] = 0;
当您调用gen_random(image_id, 32);
时,您正在分配image_32[32]
,这会导致缓冲区溢出,因为数组image_32
只有32个元素。只有0
到31
的索引才有效。