2009-12-21 65 views
0

当我试图将元素推送到堆栈我得到分段错误,但如果我打开堆栈地址(我标记为“!!!”),它是它接受它的符号。但是这次在每次推动中,它会创建新地址并且不会增加最高价值。c指针作为输入

typedef struct 
{ 
    struct table **symbols; // array of the stack 
    int top; //index of the top element 
    int size; //maximum size of the stack 
}stack; 

void push(stack *stck,struct table *element) 
{ 
    if(stck->top == stck->size) 
    { 
     printf("stack is full"); 
     return; 
    } 

    stck = malloc(sizeof(stack));           !!! 
    stck->symbols = (struct table **)malloc(50 * sizeof(struct table*)); !!! 

    printf("top : %d\n",stck->top); 
    stck->top = stck->top++; 
    printf("%d"&stck->top); 
    stck->symbols[stck->top] = element; 
    printf("top : %d\n",stck->top); 
} 
+0

你所有的逻辑是完全错误的。 投射不会使指向指针的指针确实指向指针的地址。 你必须用一个循环手动填充它,并为'表'的每一行分配空间 – 2009-12-21 16:55:06

回答

2

您必须先构建堆栈,然后才能将任何东西推到堆栈上。例如。创建功能stack_new,将为您的堆栈分配内存并初始化它的成员:

stack * stack_new (size_t size) 
{ 
    stack * stck = malloc(sizeof(stack)); 
    stck->top = -1; 
    stck->size = size 
    stck->symbols = (struct table **)malloc(size * sizeof(struct table*)); 
    return stck; 
} 

现在,一旦你正确构造具有上述功能的筹码,你可以把它传递给推功能。

+0

你是新的国王:)我忘了返回值 – iva123 2009-12-21 16:58:40

1

你传入一个堆在一个名为stck变量,但随后分配一个新的结构,并将其分配到同一个指针。所以你传入的栈不会被修改。我认为你不需要第一次malloc调用。

+0

是的,但是当我删除它时给出了分段错误:)我在问如何删除那个 – iva123 2009-12-21 16:56:06

1

在你打电话给push之前,你会想为堆栈使用malloc空间。

随着!!!行,你是每次推动分配新的内存,这是错误的。

没有!!!行,你永远不会分配内存

0

如果你传递一个单一的指针堆栈* stck,然后malloc在函数内部,它不会反映一旦你离开函数。

此外,为什么你需要为每个要推送的50个指针的表分配内存?

做它象下面这样:

struct table 
{ 
    //members go here 
}; 

typedef struct 
{ 
    struct table **symbols; 
    int top; 
    int size; 
}stack; 


struct table *get_elem(void) 
{ 
    //logic for getting elements go here 
} 

void stack_push(stack *stck, struct table *element) 
{ 

    if(stck->top==stck->size) 
    { 
    printf("Stack Full\n"); 
    return; 
    } 

    stck->top++; 
    stck->symbols[stck->top] = element; 
    return; 
} 

void stack_func() 
{ 

struct table *elem = NULL; 
stack *stck = (stack *)malloc(sizeof(stack)); 
if(NULL==stck) 
{ 
    return; 
} 

stck->top = -1; 
stck->symbols = (struct table **)malloc(50 * sizeof(struct table *)); 

if(NULL == stck->symbols) 
{ 
    free(stck); 
    return; 
} 

    stck->size = 49; 

    elem = get_elem(); 
    //do check here for correctness of elem returned from get_elem 

    stack_push(stck, elem); 

    return; 
} 

希望这有助于! :)