【发布时间】:2014-04-25 03:23:06
【问题描述】:
在我开始之前,我应该说这与直接问题无关,而是出于好奇和我无法找到与我所追求的确切相关的东西。我目前正在自学 C,我有其他几种语言的经验,所以除了确切地如何执行某些事情之外,这并不是什么新鲜事。
我想在 C 中做一个挑战,比如构建一个可以根据需要增长一定数量的 Stack,我选择为此使用结构:
#define INITIAL_STACK_SIZE 10
typedef struct Stack {
int max_size;
int cur_top;
int *elements;
} Stack;
我将元素保留为空点,因此可以根据需要对其进行扩展,这使得构建堆栈的函数如下:
Stack *Stack_make() {
Stack *stack = malloc(sizeof(Stack)); // This is ultimately where I become confused
stack->max_size = INITIAL_STACK_SIZE;
stack->cur_top = -1;
stack->elements = malloc(sizeof(int) * INITIAL_STACK_SIZE);
return stack;
}
正如我所指出的,我的困惑在于结构的 malloc。我知道 C 会在内存中对齐结构数据元素,所以我很好奇如果元素指针稍后或次要分配给结构本身,它会如何做到这一点。这是不好的做法吗?有更好的方法吗?
为了完整起见,这就是我要扩展堆栈的内容:
// Relevant bits only
int new_size = stack->max_size + INITIAL_STACK_SIZE;
int *elements = malloc(sizeof(int) * new_size));
if (elements != NULL) {
memcpy(elements, stack->elements, sizeof(int) * stack->max_size);
free(stack->elements);
stack->elements = elements;
}
我知道这不是“代码审查”的最佳场所,但如果您有改进建议以及没有的建议,我们将不胜感激。 实际问题:在 C 中是否有更好的方法来做到这一点,我是否有任何陷阱?
【问题讨论】:
-
sizeof(Stack)会处理编译器在结构中添加的任何填充。