首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sprintf堆栈缓冲区溢出

sprintf堆栈缓冲区溢出
EN

Stack Overflow用户
提问于 2019-03-25 17:15:54
回答 1查看 91关注 0票数 1

我尝试使用sprintf将字符串存储在char变量中。代码可以编译,但当我运行它时,我得到了一个堆栈缓冲区溢出错误。我的编译器会告诉我为什么会出现错误,但我不能说出真正的错误是什么。

int numbers[]是一个长度为6的数组,而matchHighest是一个= 0的整数。

我在这个函数中调用了match6:

代码语言:javascript
复制
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]);   

这里是错误发生的地方:

代码语言:javascript
复制
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中停止执行:

代码语言:javascript
复制
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);
}

停止执行时的值:

代码语言:javascript
复制
i = 5
m6 = "Rule match-6(4) - score 51"
matchArray[4] = 51
numbers[0] = 4
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-25 17:36:27

match6(&numbers[i], matchArray, &m6[100]);。您传递的项目地址超出了最后分配的项目。在此之后,match6写入越界。而不是做奇怪的事情,简单地传递数组:

代码语言:javascript
复制
char m6[100] = "";
match6(&numbers[i], matchArray, m6);  
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55334524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档