我尝试使用sprintf将字符串存储在char变量中。代码可以编译,但当我运行它时,我得到了一个堆栈缓冲区溢出错误。我的编译器会告诉我为什么会出现错误,但我不能说出真正的错误是什么。
int numbers[]是一个长度为6的数组,而matchHighest是一个= 0的整数。
我在这个函数中调用了match6:
int match(int numbers[], int matchHighest){
int matchArray[] = {0, 0, 0, 0, 0};
int i = 0;
char m6[100] = "";
char *m6p = m6;
match6(&numbers[i], matchArray, &m6[100]); 这里是错误发生的地方:
int match6 (int numbers[], int matchArray[5], char *m6){
int i=0;
while((numbers[i]==numbers[i+1]) && (i<5)){
i++;
}
if(i == 5){
matchArray[4] = 6 * numbers[0] + 27;
sprintf(m6, "Rule match-6(%d) - score %d", numbers[0], matchArray[4]);
printf("%s\n", m6);
}
return matchArray[4];
}当它运行时,我得到这个错误(底部的所有值都是正确的,正如预期的那样):
draft6.c:98运行时错误-堆栈缓冲区溢出
dcc解释:访问超出了局部变量的末尾。确保数组的大小正确。确保数组索引是正确的。
在match6(4) - score 51")中第98行的draft6.c中停止执行:
if(i == 5){
matchArray[4] = 6 * numbers[0] + 27;
--> sprintf(m6, "Rule match-6(%d) - score %d", numbers[0], matchArray[4]);
printf("%s\n", m6);
}停止执行时的值:
i = 5
m6 = "Rule match-6(4) - score 51"
matchArray[4] = 51
numbers[0] = 4发布于 2019-03-25 17:36:27
match6(&numbers[i], matchArray, &m6[100]);。您传递的项目地址超出了最后分配的项目。在此之后,match6写入越界。而不是做奇怪的事情,简单地传递数组:
char m6[100] = "";
match6(&numbers[i], matchArray, m6); https://stackoverflow.com/questions/55334524
复制相似问题