【问题标题】:sprintf stack buffer overflowsprintf 堆栈缓冲区溢出
【发布时间】: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]) &amp;&amp; (i&lt;5)){ 你在这里访问 numbers[5]
  • 查看match6 的确切调用会很好。连同你作为参数传入的东西的声明。
  • 你有没有为char *m6分配内存?
  • 我编辑了我的帖子。如果您需要更多信息,请告诉我

标签: c


【解决方案1】:

match6(&amp;numbers[i], matchArray, &amp;m6[100]);。您将项目的地址传递到最后分配的项目之外。之后 match6 写入越界。不要做奇怪的事情,只需传递数组即可:

char m6[100] = "";
match6(&numbers[i], matchArray, m6);  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2010-11-11
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多