c - Segmentation Fault (Core dumped),但找不到故障
问题描述
#include <stdlib.h>
#include <stdio.h>
#include "stack.h"
struct stack {
// ... SOME CODE MISSING HERE ...
int top;
int stackArray[STACK_SIZE];
int push;
int pop;
};
struct stack *stack_init() {
struct stack* s = (struct stack*) malloc(sizeof(struct stack));
s->top = 0;
if (s == NULL)
return NULL;
else
return s;
}
void stack_cleanup(struct stack* s) {
for(int i = 0; i < STACK_SIZE; i++)
s->stackArray[i] = 0;
free(s);
}
int stack_push(struct stack *s, int c) {
if (s->top <= STACK_SIZE){
s->stackArray[s->top] = c;
s->top++;
s->push++;
return 0;
}
else
return 1;
}
int stack_pop(struct stack *s) {
if (!stack_empty(s)){
return s->stackArray[s->top];
s->top--;
s->pop++;
}
else
return -1;
}
int stack_peek(struct stack *s) {
if (!stack_empty(s)){
return s->stackArray[s->top];
}
else
return -1;
}
int stack_empty(struct stack *s) {
if (s->top == -1)
return 1;
else
return 0;
}
int main(){
struct stack *test;
// stack_peek(test);
// return 0;
printf("%d\n", test->top);
}
我正在尝试使用 C 为大学作业实现一个非常基本的堆栈,并且我正在尝试测试该实现,但它只给出了一个错误Segmantation fault (Core Dumped)
。我在互联网上做了一些研究,但找不到可以帮助我的东西。我理解这Segmentation Fault Core Dumped
意味着我正在访问一些我不能/不应该访问的东西,但我不知道这如何适用于我的代码。
谢谢。
解决方案
最好的办法是使用 gdb 运行它,并在它出现段错误后使用 bt cmd 获取堆栈跟踪。我在您的初始代码中添加了一些注释,这些注释可能会或可能不会解决您的问题,但 main 显然被破坏了。main 中的“test”从未分配给任何东西,因此 test->top 试图取消引用分配给“test”的任何地址,这可能是当时“c 程序堆栈的内存”中的任何垃圾值。确保在使用变量之前对其进行初始化。
#include <stdlib.h>
#include <stdio.h>
#include "stack.h"
struct stack {
// ... SOME CODE MISSING HERE ...
int top;
int stackArray[STACK_SIZE];
int push;
int pop;
};
struct stack *stack_init() {
struct stack* s = (struct stack*) malloc(sizeof(struct stack));
s->top = 0; // HERE IS A POTENTIAL NULL POINTER DEREFENCE, MOVE THIS AFTER THE NULL CHECK
if (s == NULL)
return NULL;
else
//HERE IS WHERE THE ABOVE LINE SHOULD BE LOCATED. s->top = 0;
//WHAT ABOUT THE REST OF THE MEMORY IN THIS STRUCTURE, SHOULD IT BE 0?
return s;
}
void stack_cleanup(struct stack* s) {
for(int i = 0; i < STACK_SIZE; i++)
s->stackArray[i] = 0;
free(s);
}
int stack_push(struct stack *s, int c) {
if (s->top <= STACK_SIZE){ //CAN s->top EVER BE NEGATIVE?
s->stackArray[s->top] = c; //BECAUSE THIS WOULD BE A BAD INDEX IF IT WERE NEGATIVE HERE
s->top++;
s->push++;
return 0;
}
else
return 1;
}
int stack_pop(struct stack *s) {
if (!stack_empty(s)){
return s->stackArray[s->top];
s->top--;//THIS LOOKS LIKE IT WILL NEVER GET EXECUTED
s->pop++;//SAME WITH THIS LINE, MOVE THEM ABOVE THE RETURN STATEMENT IF YOU WANT THEM TO BE EXECUTED.
}
else
return -1;
}
int stack_peek(struct stack *s) {
if (!stack_empty(s)){
return s->stackArray[s->top];
}
else
return -1;
}
int stack_empty(struct stack *s) {
if (s->top == -1)
return 1;
else
return 0;
}
int main(){
struct stack *test; //EITHER MALLOC MEMORY FOR THIS GUY OR PUT IT ON THE STACK (stack vs heap memory)
//SAMPLE STACK USAGE, DOESNT USE YOUR INIT FUNCTION
struct stack test;
memset(test, 0, sizeof test);
//IF YOU DONT WANT TO MALLOC YOU CAN POINT IT TO THE STACK VERSION ABOVE
struct stack *test2 = &test; //NOW YOU DONT NEED MALLOC, BUT YOU STILL DIDNT USE YOUR SPECIAL INIT.
// stack_peek(test);
// return 0;
printf("%d\n", test->top);
}
我所有引用堆栈的代码审查评论都指的是 ac 程序中的堆栈内存,而不是您在此处定义的结构(这也是一个堆栈,因此有点令人困惑)。 https://www.geeksforgeeks.org/memory-layout-of-c-program/
推荐阅读
- r - 匹配和替换部分字符串的优雅方式
- javascript - d3.js - 检测具有相同中心的圆圈
- vba - Excel VBA:使用 .Find 识别单元格内容并将行复制到新选项卡(多个搜索词)
- mysql - 计算百分比两个值和求和算术运算mysql
- swift - 无法在 RxSwift 中使用通用结果枚举错误
- reactjs - React Native - TypeError:this.addItem.bind
- php - 如何制作具有多个选项卡的过滤器并在laravel中动态获取数据
- android - 在 AsyncTask 中使用 onPostExecute 方法列表项单击事件调用 Android 中的另一个活动
- c++ - 如何在 C++ 中按值对地图进行排序,但如果键值相等?
- javascript - jQuery - onClick 在新页面中打开随机链接