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];
}