堆栈粉碎在递归函数中检测到错误

问题描述 投票:0回答:1

我正在尝试编写一个程序,获取输入

step
并以 LATEX 格式打印以下内容:

enter image description here

输出是

1+\frac{2+\frac{4}{5}}{3+\frac{6}{7}}

这是我编写的代码,但输入超过

*** stack smashing detected ***: terminated
时会出现
6
错误。

知道如何管理这个(至少对于低于 10 的输入)?

#include <stdio.h>
#include <stdlib.h>

void frac(int start, int step, char *result) {
    if (step == 1) {
        sprintf(result, "%d", start);
    } else {
        char left[256];
        char right[256];
        frac(2 * start, step - 1, left);
        frac(2 * start + 1, step - 1, right);
        sprintf(result, "%d+\\frac{%s}{%s}", start, left, right);
    }
}

int main() {
    int step;
    scanf("%d", &step);
    
    char result[1024];
    int start = 1;
    frac(start, step, result);
    printf("%s\n", result);
    
    return 0;
}
c overflow
1个回答
1
投票

您会收到堆栈粉碎消息,因为您会导致函数中的缓冲区溢出。

对于步骤 2-6,所得长度为 13、37、91、203、427。 这意味着,任何额外的步骤,长度都会增加一倍以上。

第 7 步已经超出了您的缓冲区长度。也许不在

result
缓冲区中,但显然在
left
right
缓冲区中,它们应该约为
result
大小的一半。

您需要为字符串提供更大的缓冲区。

由于您的缓冲区位于大小有限的堆栈上,您也可以更改为动态分配缓冲区。

© www.soinside.com 2019 - 2024. All rights reserved.