获取c中堆栈的分段错误



我有一个堆栈结构体,它具有执行简单堆栈操作的动态双指针char数组。我用calloc初始化内存,使其在数组中具有确定的值。它在数组的大小达到10个元素后重新分配空间。

我的代码的堆栈结构:

typedef struct Stack{
unsigned int size; //The current number of elements in the stack
char **stk; //The actual stack represented by an array of strings
unsigned int arrsize; //To track the size of the array; gets incremented by 10 after limit
}stack;

我的堆栈文件代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "stack.h"
#define MULTIPLIER 10
#define MAX_STR 1024
stack *createstack(void){
stack *s = malloc(sizeof(stack));
if(s == NULL){
perror("Failed to malloc!n");
return NULL;
}
s->size = 0;
s->arrsize = MULTIPLIER;
s->stk = calloc(MULTIPLIER, sizeof(char*));
for (int i = 0; i < MULTIPLIER; i++){
s->stk[i] = calloc(MAX_STR, sizeof(char));
}
return s;
}

int isfull(const stack *s){
if(s->size % MULTIPLIER == 0){
return 0;
}
else{
return 1;
}
}
int isempty(const stack *s){
if(s->size == 0){
return 0;
}
else{
return 1;
}
}
void push(stack *s, char *item){
if(isfull(s) == 0){
char **temp = realloc(s->stk, (sizeof(char*)) * (MULTIPLIER + s->arrsize));
s->arrsize += MULTIPLIER;
if(temp == NULL){
perror("Realloc failed!");
}
}
strcpy((s->stk)[s->size], item);
s->size += 1;
}
char *pop(stack *s){
if(isempty(s) == 0){
printf("Stack is empty!");
return NULL;
}
else{
char *tmp = (char*) malloc(strlen((s->stk)[s->size-1]));
strcpy(tmp, (s->stk)[s->size-1]);
s->size -= 1;
return tmp;
}
}
void destroy(stack *s){
if(isempty(s) == 0){
printf("Stack is already empty!");
}
else{
for(size_t i=0; i < sizeof s; i++){
free((s->stk)[i]);
}
s->size = 0;
free(s->stk);
free(s);
}
}

现在,当在main函数中当我做像

这样的事情时
int main(){
stack *stek = NULL;
stek = createstack();
push(stek, "first");
push(stek, "second");
push(stek, "third");

我得到一个"分割错误(核心转储)"&;gcc错误。在检查gdb后,我验证了它是在" strpy& quot;中引起的。调用push()。经过进一步的推测,我得到的想法,也许内存没有被分配给s->stk数组,即使我用callc初始化它。如果您能帮忙解决这个问题,我将不胜感激。

编辑:修正了在注释中指出的代码中的一些小错误。

push()重新分配时(这在第一次push时是不必要的),它不会用指向重新分配空间的指针更新堆栈结构。假设原始指针在此时仍然有效是不安全的,因此稍后尝试对其解引用是不安全的。这可能是导致段错误的缺陷。

此外,当push()扩展堆栈存储时,它不遵循createstack()的模型,为新元素分配空间指向。这不会是您在示例main()中看到的段错误的原因,但是如果您推送了足够的元素,这将是一个问题。

相关内容

  • 没有找到相关文章

最新更新