C++ 我犯了一个错误。我已经做了代码,看看括号是否平衡。C++;

C++ 我犯了一个错误。我已经做了代码,看看括号是否平衡。C++;,c++,linked-list,segmentation-fault,stack,C++,Linked List,Segmentation Fault,Stack,我写这段代码是为了检查表达式中是否有平衡括号。我使用了堆栈的链表实现。我得到一个分割错误。请首先解释为什么我们会出现分段错误,我是新手,很难理解分段错误和内存管理的概念 #include <iostream> using namespace std; struct stack { char data; struct stack *next; }; struct stack *top = NULL; void push(char data) { struct s

我写这段代码是为了检查表达式中是否有平衡括号。我使用了堆栈的链表实现。我得到一个分割错误。请首先解释为什么我们会出现分段错误,我是新手,很难理解分段错误和内存管理的概念

#include <iostream>
using namespace std;
struct stack {
    char data;
    struct stack *next;
};
struct stack *top = NULL;
void push(char data) {
    struct stack *temp = (struct stack *)malloc(sizeof(struct stack));
    temp->data = data;
    temp->next = top;
    top = temp;
    return;
}
void pop() {
    struct stack *temp = top;
    top = top->next;
    return;
}
int isEmpty() {
    if (top == NULL)
        return 1;
    else
        return 0;
}
int main() {
    int i = 0;
    char array[250];
    cout << "Enter code and end with $ sign : " << endl;
    cin.getline(array, 250, '$');
    while (array[i] != '\n') {
        if (array[i] == '{' || array[i] == '[' || array[i] == '(') {
            push(array[i]);
        } else if (array[i] == '}' || array[i] == ']' || array[i] == ')') {
            if (array[i] == '}' && top->data == '{')
                pop();
            else if (array[i] == ']' && top->data == '[')
                pop();
            else if (array[i] == ')' && top->data == '(')
                pop();
            else {
                cout << "Not Balanced" << endl;
                return 0;
            }
        }
        i++;
    }
    if (isEmpty() == 1)
        cout << "Balanced" << endl;
    else
        cout << "Not Balanced" << endl;
    return 0;
}
#包括
使用名称空间std;
结构堆栈{
字符数据;
结构堆栈*下一步;
};
结构堆栈*top=NULL;
无效推送(字符数据){
结构堆栈*temp=(结构堆栈*)malloc(sizeof(结构堆栈));
温度->数据=数据;
温度->下一步=顶部;
顶部=温度;
返回;
}
void pop(){
结构堆栈*温度=顶部;
顶部=顶部->下一步;
返回;
}
int isEmpty(){
if(top==NULL)
返回1;
其他的
返回0;
}
int main(){
int i=0;
字符数组[250];
cout data=='[')
pop();
如果(数组[i]==”)&&top->data==”(“)
pop();
否则{

cout因此,我将首先解释分段错误的含义及其发生原因。当程序尝试读取不允许读取的内存时,就会发生分段错误。如果您尝试获取分配数组之外的数组元素,则会发生这种情况,如果您取消引用空指针,也会发生这种情况

我认为在您的情况下,问题可能是循环未能在正确的位置结束,并最终访问了分配的250个空间之外的数组元素。根据此引用,getline()实际上不在数组中包含换行符,但它总是附加空字符“\0”

请尝试将
while(array[i]!='\n')
更改为
while(array[i]!='\0')
,并告诉我这是否解决了问题。否则,我将继续查找更多错误。您的代码不是超级可读的,并且有很多地方可能出错。我建议在每个函数之间添加空行

此外,正如molbdnilo提到的,如果右大括号太多,也会出现分段错误,因为在这种情况下,top将等于null,并且您的程序将在您的条件下尝试使用
top->data
取消对top的引用


我还注意到您使用了很多C约定,比如struct、malloc()NULL,它很好,但是要确保C和C++之间有区别,并且在学习时尽量坚持C++源,这样你就不会感到困惑。祝你好运!< /P>请将缩进,使用空格,应用到你的代码中。这样会使它更可读。⟼此代码可以通过采用和一致地应用而受益匪浅。缩进传达了结构和意图,使我们更容易理解您的代码,而无需花费大量时间对其进行破译,并且还可以使错误更加明显,因为它们在视觉上非常突出。更喜欢使用
运算符new
,而不是<代码> MaloC/<代码>。<代码> Malc C <代码>函数不调用构造函数。声明指针或实例时不需要使用<代码>结构> /COD>。这主要允许将C程序移植到C++(和可能是古C++程序)。谢谢你的帮助,代码现在工作得很好。我只是从C转到C++,尝试使用C++更多,同时也让我的代码更可读。我的所有案例都是工作的,除了我第一次使用时。或者)你仍然有这个问题吗?当你第一次使用右大括号时,你是否遇到了一个seg错误?我没有仔细看,但我假设top开始时为null,所以如果你在向top添加任何内容之前尝试查看top->data,你可能会遇到一个seg错误。解决这个问题的方法是在top->data==无论是C还是C++,大多数编程语言都会停止评估,只要条件肯定是真的,那么如果你在if语句中检查NULL,那么你就不会得到Sebug。return top->data,而不是检查全局top.idk(如果您知道返回类型),但是您可以让pop返回队列顶部的字符,您可以检查top==NULL并在pop()中处理它