段违规到运行生成器的单词

时间:2015-08-12 22:13:56

标签: c function

在编译用户提供的示例时出现此问题,在this 线程中,我真的不明白,因为此处发生的错误是我用来调用函数的代码

#include <stdio.h>

char *construct_word(char *const str, size_t len, size_t seed)
{
    char letter[26] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
                        'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
                        's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
                      };
    size_t n = 26;

    if (str == NULL || len < 1)
        return NULL;

    while (len > 1 && n > 0)
    {
        const size_t i = seed % n;
        seed /= n;
        str[len++] = letter[i];
        letter[i] = letter[--n];
    }
    str[len] = '\0';

    return str;
}

int main (void)
{
    char buffer[30];
    printf("%s\n", construct_word(buffer, 26, 15));

    return 0;
}

任何人都知道我做错了吗?

1 个答案:

答案 0 :(得分:1)

len中调用函数时,为main传递26并开始填充该索引处的缓冲区。您的缓冲区大小为30,因此在3次迭代后您将访问并分配到未分配的空间,这会导致分段错误。

您可能希望另一个初始化为0的变量用作分配到缓冲区的索引。只要该变量为< len,就循环。

int bufIndex = 0;
while (bufIndex < len && n > 0)
{
    const size_t i = seed % n;
    seed /= n;
    str[bufIndex++] = letter[i];
    letter[i] = letter[--n];
}