Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 运行生成器字的段冲突_C_Function - Fatal编程技术网

C 运行生成器字的段冲突

C 运行生成器字的段冲突,c,function,C,Function,这个问题发生在编译用户提供的示例时,在线程中,我真的不理解,因为错误发生在我用来调用函数的代码中 #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

这个问题发生在编译用户提供的示例时,在线程中,我真的不理解,因为错误发生在我用来调用函数的代码中

#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;
}
有人知道我做错了吗?

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

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


我建议在问题的主体中添加一条特定的错误消息。您是否尝试使用调试器单步执行代码?您可以从str[len++]开始,例如str[26],然后将其增加26倍。例如,您将char 26写入到char 52,缓冲区大小为30。您应该真正学会使用调试器。是的,如果在调试器下运行,或者甚至通过几个printf调用运行,这一点很明显。
int bufIndex = 0;
while (bufIndex < len && n > 0)
{
    const size_t i = seed % n;
    seed /= n;
    str[bufIndex++] = letter[i];
    letter[i] = letter[--n];
}