这只是程序的一部分,但我不理解这些代码为什么我们在结构中声明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);
}
答案 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; <-----------------+---------------+
}
这里有无符号的用法
unsigned
是unsigned 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引入了可变长度数组,其大小可以在运行时指定,但由于多种原因,它们不能在此上下文中工作。