出于学习目的,我正在用 c 语言实现一个堆栈及其函数。
我添加了一些小的附加功能来第一次使用 malloc 并尝试正确理解它。
我编写了一个最初创建堆栈结构的函数。该函数的返回值是一个具有已分配内存的新结构。在返回值应该是结构的函数中处理 malloc 异常的最佳方法是什么?也许我应该设计不同的功能?我知道 printf 没有完成它的工作;)
我的堆栈结构:
typedef struct Stack
{
int count;
int capacity;
int *data;
} Stack;
创建堆栈实例:
Stack create_stack(int initialcapacity)
{
Stack new_stack;
new_stack.count = 0;
new_stack.capacity = initialcapacity;
if (!(new_stack.data = malloc(initialcapacity * sizeof(int))))
printf("not enough memory!");
return new_stack;
}
使用堆栈的初始容量调用该函数:
Stack stack = create_stack(10);
当我编写删除 Stack 实例的函数时出现了第二个问题。
int delete_stack(Stack *stack)
{
stack->count = 0;
stack->capacity = 0;
free(stack->data);
stack->data = NULL;
return 0;
}
我还可以删除结构实例本身吗?仅仅将值设置回 0 并将 int* 直接设置为 NULL 感觉并不完整。
最后但并非最不重要的一点是,我对我的推送功能有疑问。另外,我在这里添加了一些功能,允许我在堆栈已满时将某些内容推送到堆栈上:
void push(int value, Stack *stack)
{
if (stack->count == stack->capacity)
{
int *temp = malloc(stack->capacity * sizeof(int));
int i;
for (i = 0; i < stack->count; i++)
temp[i] = stack->data[i];
free(stack->data);
stack->data = NULL;
stack->data = malloc(stack->capacity * 2 * sizeof(int));
for (i; i > -1; i--)
stack->data[i] = temp[i];
free(temp);
temp = NULL;
stack->data[stack->count] = value;
stack->count++;
stack->capacity = stack->capacity * 2;
}
else
{
stack->data[stack->count] = value;
stack->count++;
}
}
在分配两倍大小的新数组之前,是否有必要“释放”较小的数组并将指针设置为 NULL?
如果我的代码中有任何不必要或编写不正确的内容,请告诉我,我很感激任何使我变得更好的提示。
干杯,
我