C堆栈使用数组

时间:2014-12-29 11:58:01

标签: c singly-linked-list

这只是程序的一部分,但我不理解这些代码为什么我们在结构中声明int *数组是什么意思? 我们通常在函数类型之前使用int或void为什么我们在创建函数之前编写struct Stack *以及在这里使用unsigned有什么用?单击链接以查看实际程序。 a link

struct Stack {
    int top;
    unsigned capacity;
    int* array;
};

struct Stack* createStack(unsigned capacity) {
    struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack));
    stack->capacity = capacity;
    stack->top = -1;
    stack->array = (int*) malloc(stack->capacity * sizeof(int));
    return stack;
}

int main() {
    struct Stack* stack = createStack(100);
}

2 个答案:

答案 0 :(得分:1)

1)使用int *因为我们事先不知道数组的大小,所以我们将它声明为指针并使用堆栈的容量来执行malloc。

如果我们使用了数组,我们必须执行额外的检查以查看我们的初始声明的大小是否已经溢出,并且在整个程序中将是一个巨大的开销。

2)函数create stack根据函数的语法返回类型为stack的结构ponter。

语法:

<return type> function_name(<Parameters>){<Statements>}

3)如果有人试图声明负容量,我们希望程序给我们一个错误。无符号确保满足

希望这有帮助。

答案 1 :(得分:1)

  

为什么我们在结构中声明int *数是什么意思?

array成员用于存储堆栈的内容。但是,我们事先并不知道堆栈需要保留多少元素,因此我们无法将其声明为常规数组(其大小必须在编译时 1 )。相反,我们将在运行时使用malloc库函数分配内存,该函数返回指向动态分配块的第一个元素的指针;该指针将存储到数组成员中。

  

为什么我们在创建函数

之前编写struct Stack *

因为createStack函数正在返回指向新struct Stack实例的指针:

struct Stack *createStack( ... )  ----------------+
{                                                 | The type of the expression in the 
  struct Stack *stack = ...; -----+               | `return` statement must match the  
  ...                             |               | return type of the function
  return stack; <-----------------+---------------+
}
  

这里有无符号的用法

unsignedunsigned int的缩写;它保证只有非负值可用于堆栈大小。

这里是调用createStack函数后的内存:

                   +---+
            stack: |   |----+  // The stack variable points to a struct Stack instance
                   +---+    |
                    ...     |
                   +---+    |
       stack->top: |   |<---+  // The actual struct Stack instance is created on the heap
                   +---+       // The -> operator allows us to refer to the members of the
  stack->capacity: |   |       // instance through the stack pointer variable.
                   +---+       
     stack->array: |   |----+  // The memory for the stack contents is allocated in a 
                   +---+    |  // separate malloc call, and the resulting pointer is
                    ...     |  // stored in the instance's array member.  
                   +---+    |
  stack->array[0]: |   |<---+
                   +---+
  stack->array[1]: |   |
                   +---+
  stack->array[2]: |   |
                   +---+
                    ...
                   +---+
stack->array[N-1]: |   |    // N == stack->capacity
                   +---+

stack中的main变量指向struct Stack的实例;此实例由行

创建
struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack));
createStack函数中的

。堆栈实例的内存取自&#34;堆&#34; (为动态分配保留的内存区域)。在堆栈实例中,array成员还指向另一个malloc调用保留的动态内存区域:

stack->array = (int*) malloc(stack->capacity * sizeof(int));

此函数留出足够的内存来存储int成员中指定的capacity个对象。

修改

请注意,可以按如下方式清除malloc个调用:

struct Stack *stack = malloc( sizeof *stack );
...
stack->array = malloc( stack->capacity * sizeof *stack->array );

除非您使用的是早于1989标准的C ++编译器或C编译器,否则无需进行强制转换(在C89实现中,这是危险的)。

sizeof表达式使用解除引用的目标表达式,而不是类型名称;如果您决定更改目标变量的类型(例如,从int *double *),这会清除一些视觉混乱,并减少维护。表达式*stack的类型为struct Stack,因此它遵循sizeof *stack == sizeof (struct Stack)。同样,表达式*stack->array的类型为int,因此sizeof *stack->array == sizeof (int)。请注意,仅当sizeof的操作数是类型名称时才需要括号。

<小时/> 1。 C99引入了可变长度数组,其大小可以在运行时指定,但由于多种原因,它们不能在此上下文中工作。