【发布时间】:2019-03-25 09:15:54
【问题描述】:
我正在尝试使用 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) 中停止 - 在 draft6.c 第 98 行得分 51"):
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
【问题讨论】:
-
你怎么打电话给
match6?可能是while((numbers[i]==numbers[i+1]) && (i<5)){你在这里访问numbers[5]。 -
查看
match6的确切调用会很好。连同你作为参数传入的东西的声明。 -
你有没有为
char *m6分配内存? -
我编辑了我的帖子。如果您需要更多信息,请告诉我
标签: c