在编译用户提供的示例时出现此问题,在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;
}
任何人都知道我做错了吗?
答案 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];
}