C确定了STACK OVERFLOW

时间:2015-09-15 23:01:17

标签: c stack-overflow

我已经制作了上面的代码,我使用了两个不同的编译器,一个说“Segmentation Fault”,另一个说“handle_exceptions:Exception:STATUS_STACK_OVERFLOW”。 这是代码。

int main() {
    int k, x, f, i, j, tmp, ct;
    scanf("%d %d", &k, &x);
    int w[k];
    for( f = 0; f<k; f++){
        scanf(" %d", &w[f]);
    }
    while(x--){
        scanf("%d %d", &i, &j);
        tmp = 3;
        for(ct = j; i<=ct<=j; ct--){
            if(tmp > w[ct]){
                tmp = w[ct];
            }
        }
        printf("%d\n", tmp);
    }
    return 0;
}

我已经对这段代码进行了逐行评论和测试,我在这里发现错误:

int w[k];

我不知道我能做什么,因为在发生此向量的声明时已经定义了 k 变量。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:3)

如果您定义了这样的数组:

int w[k];

它将存储在堆栈中,该堆栈的大小有限。

如果使用malloc初始化,数据将存储在堆中(其大小也有限,但它允许您存储更多数据)

int *w = malloc(sizeof(int) * k);

你试过这个吗?

检查this堆栈与堆之间的差异。

始终检查malloc()的返回值,这只是一个示例,但不是returned value of malloc()是不好的做法。

答案 1 :(得分:-2)

除非使用动态内存分配,否则无法在运行时定义变量大小。

正如我所看到的,您正在尝试根据用户的输入设置变量大小。

为此,您必须使用动态内存分配。

scanf("%d %d", &k, &x);
if(k > MAX_SIZE) {
    return -1;
}
int *w = malloc(sizeof(int) * k);

现在根据用户输入输入的大小分配内存。但请确保您施加了一些限制,因为堆内存有限。