2009-12-21 53 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; 
} 

希望這有助於! :)