我是否正确进行动态内存分配,而没有分配任何不必要的空间?

问题描述 投票:0回答:1

为此代码动态地为堆栈分配了多少内存?

#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
个项目的堆栈分配内存。
这是实现我的目标的正确方法吗?如果不是,那么请向我提供更好的代码,可能带有修改后的结构定义。我的代码得到了所需的结果。

c++ c data-structures malloc dynamic-memory-allocation
1个回答
4
投票

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]) );

© www.soinside.com 2019 - 2024. All rights reserved.