我有一個堆疊結構,它具有執行簡單堆疊操作的動態雙指標 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);
}
}
現在,當我在主函式中做類似的事情時
int main(){
stack *stek = NULL;
stek = createstack();
push(stek, "first");
push(stek, "second");
push(stek, "third");
我收到 gcc 的“分段錯誤(核心轉儲)”錯誤。在檢查 gdb 后,我確認它是由 push() 中的“strcpy”呼叫引起的。經過進一步的猜測,我得到了一個想法,即使我使用 calloc 初始化它,也可能沒有將記憶體分配給 s->stk 陣列。任何有關弄清楚如何解決此錯誤的幫助都將得到認可。
編輯:在評論中指出后修復了代碼中的一些小錯誤。
uj5u.com熱心網友回復:
當push()重新分配時(它在第一次推送時不必要地執行),它不會使用指向重新分配空間的指標更新堆疊結構。假設原始指標在那一點仍然有效是不安全的,因此稍后嘗試取消參考它是不安全的。這可能是導致段錯誤的缺陷。
另外,當push()擴展堆疊存盤時,它不遵循createstack()通過為新元素分配空間來指向的模型。這不是您在示例中看到的段錯誤的原因main(),但如果您推送了足夠多的元素,這將是一個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314967.html
上一篇:C 中的多維陣列和指標
下一篇:C將char陣列傳遞給函式和指標
