简体   繁体   中英

Implement a stack by using a pointer to pointer

I am implementing a small program to exercise with double pointers This is the main program:

#include <stdio.h>
#include "serial.h"
#include "stack.h"

int main(void) {
    serial_init();  

    /* Array to hold stack entries */
    int stack[10]={0};
    /* Stack pointer */
    int *stack_p = stack;

    /* Code to call the functions */

    push(&stack_p, 1); 
    push(&stack_p, 2); 
    push(&stack_p, 3); 
    push(&stack_p, 4); 

    printf("popped value: %d\r\n", pop(&stack_p));
    printf("popped value: %d\r\n", pop(&stack_p));
    printf("popped value: %d\r\n", pop(&stack_p));
    printf("popped value: %d\r\n", pop(&stack_p));
}        

void push(int **sp, int value) {
    /*  Implement it */ 
}

int pop(int **sp) {
    /*  Implement it */ 
}

I have implemented the push function it seems ok. However, the pop return back just the last element and then 10

void push(int **sp, int value) {
/* implemented it*/

 int *pt; 
 pt=&value; // Store the value to the pointer 

 printf("Push value is is %d\r\n", *pt);
 sp = &pt; // associate the pointer to the pointer of pointer
 ++(*pt);   
}

int pop(int **sp) {
 /* implemented it */
 int value;
 int *pt;
 pt=&value;

 sp = &pt;
 *pt--;

 return value;
}   

Your push and pop functions are overly complicated and totally wrong:

You want this:

void push(int **sp, int value) {
  **sp = value;   // put value onto top of the stack
  (*sp)++;        // increment stack pointer
}

int pop(int **sp) {
  (*sp)--;        // decrement stack pointer
  return **sp;    // return value which is on nthe op of the stack
}

Your wrong code for push with explanations in comments:

void push(int **sp, int value) {
  int *pt; 
  pt=&value; // here you put the pointer to the local variable value
             // into pt, but local variables disappear as soon
             // as the function has finished

  //  the printf is the only thing one more or less correct
  //  but you could just print directly 'value' like this:
  //    printf("Pushed value is %d\r\n", value);
  //
  printf("Push value is is %d\r\n", *pt);

  sp = &pt;  // this only assigns the pointer to the local variable pt to 
             // the local variable sp

  ++(*pt);   // here you increment actually the local variable
             // value which is pointless 
}

By the way: the initialisation to zero of the whole stack is not necessary, although it might help during the debugging process. So you can write the declaration of the stack like this:

int stack[10];  // no initialisation necessary

Exercise for you:

Explain the exact reason why it is not necessary to initialize all elements of the stack to zero.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM