C / C ++ - 生成随机字符串覆盖之前的代码(参见下面的代码)

时间:2014-02-01 18:33:03

标签: c++ c string

我正在尝试使用找到的代码生成随机字母数字字符串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

这怎么可能?我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

我不确定这是否是造成问题的根本原因,但这是一个错误:在函数gen_random内:

s[len] = 0;

当您调用gen_random(image_id, 32);时,您正在分配image_32[32],这会导致缓冲区溢出,因为数组image_32只有32个元素。只有031的索引才有效。