为此代码动态地为堆栈分配了多少内存?
#include<iostream>
using namespace std;
#define max_size 100
typedef struct stack
{
int top;
int capacity;
int items[max_size];
} stack;
stack* initialize(stack *s, int capacity)
{
s = (stack*)malloc((capacity)*sizeof(int) + sizeof(int) + sizeof(int));
s->top = -1;
if(capacity<1)
cout<<"invalid capacity !"<<"\n";
else
s->capacity = capacity;
return s;
}
我试图避免任何额外的内存分配。我没有使用这行代码:
stack *s = (stack*)malloc(sizeof(stack));
因为它会创建一堆
max_size
的项目。 我想严格为包含 capacity
个项目的堆栈分配内存。 这是实现我的目标的正确方法吗?如果不是,那么请向我提供更好的代码,可能带有修改后的结构定义。我的代码得到了所需的结果。
malloc((capacity)*sizeof(int) + sizeof(int) + sizeof(int));
这是行不通的,编译器期望
capacity
静态地正好是 100 个项目,因为您这样声明了数组成员。您不能为结构体分配内存不足并期望程序以某种方式运行 - 这在任何一种语言中都是未定义的行为。
C++ 的正确解决方案是使用
std::vector
或 std::stack
等代替。你永远不应该在 C++ 程序中使用 malloc
:这很危险,因为它不调用构造函数等,而 C++ 中的 struct
只是一个穷人的类。
C 的正确解决方案是使用灵活的数组成员:
typedef struct stack
{
int top;
int capacity;
int items[];
} stack;
...
stack *s = malloc( sizeof(stack) + sizeof(int[capacity]) );