为什么取消注释此行会导致分段错误?

时间:2016-02-23 22:52:08

标签: c segmentation-fault

出于某种原因,取消注释最后一行会导致分段错误。我不知道为什么会发生这种情况,因为它只是创建一个新的字符串。 代码是:

char str[] = "()";
if (isBalanced(str))
    printf("%s is balanced\n", str);
else printf("%s is not balanced\n", str);
char str1[] = "((1()";
if (isBalanced(str1))
    printf("%s is balanced\n", str1);
else printf("%s is not balanced\n", str1);
//char str2[] = "((1){()})";

没有错误,程序按预期运行,但是一旦取消注释最后一行,就会在任何打印语句打印之前发生分段错误。

我发现将str2 []更改为hi []可以解决问题,但为什么会这样呢? stdio.h没有定义任何干扰这里的宏,而str2不是C中的关键字。如果我忽略了一些愚蠢的东西,请告诉我。

这是完整的程序。

#include <stdio.h>
int isBalanced(char *str) {
    int x = 0;
    int length;
    while (str[x++] != '\0') length++;
    char open[50];
    unsigned int numOpen = 0;
    for (x = 0; x < length; x++) {
        if (str[x] == '{')
            open[numOpen++] = str[x];
        if (str[x] == '(')
            open[numOpen++] = str[x];
        if (str[x] == '[')
            open[numOpen++] = str[x];
        if (str[x] == '}') {
            if (open[numOpen-1] != '{')
                return 0;
            else numOpen--;
        } 
        if (str[x] == ')') {
            if (open[numOpen-1] != '(')
                return 0;
            else numOpen--; 
        }
        if (str[x] == ']') {
            if (open[numOpen-1] != '[')
                return 0;
            else numOpen--; 
        }
    }
    return numOpen == 0;
}

int main() {
    char str[] = "()";
    if (isBalanced(str))
        printf("%s is balanced\n", str);
    else printf("%s is not balanced\n", str);
    char str1[] = "((1()";
    if (isBalanced(str1))
        printf("%s is balanced\n", str1);
    else printf("%s is not balanced\n", str1);
    char str2[] = "((1){()})";
    //if (isBalanced(str1))
    //  printf("%s is balanced\n", string);
    //else printf("%s is not balanced\n", string);
}

提前致谢。

1 个答案:

答案 0 :(得分:4)

  

如果我忽视了一些愚蠢的事情,请告诉我。

是的,你是。您正在使用未初始化的变量。这导致了不确定的行为。改变

int length;

int length = 0;
isBalanced中的