2015-12-15 46 views
2

我已经通过一个C项目来了解一些概念并找到了下面的代码。如何确定总内存分配?

#define MY_NODE_ALLOC(coffee) ((struct items *)(coffee) + 1) 

struct store 
{ 
    char *name; 
    int id; 
}; 

struct items 
{ 
    char *itemName 
    char *itemCode; 
    int quantity; 
}; 

void * allocation(struct store *shop) 
{ 
    struct items *coffee = malloc(sizeof(struct items) + sizeof(*shop)); 
    return MY_NODE_ALLOC(coffee); 
} 

我有以下几个问题

  1. 多少总内存分配?是否等于*shopstruct items的尺寸?

  2. 是什么2所陈述malloc(sizeof(struct itmes));malloc(sizeof(*shop));

  3. 这是什么宏返回的区别?根据我的理解,将1加入指针用于跳转到数组中的下一个元素,但我不明白这种情况。

回答

2

1-多少总内存分配?是否等于*shopstruct items的尺寸?

是的,总大小加在一起,以字节为单位,以防malloc()成功。

2-是什么2个语句malloc(sizeof(struct itmes));malloc(sizeof(*shop));

两个语句之间的差分配不同量的存储器,在成功的情况下。

  • malloc(sizeof(struct itmes));以字节为单位分配与struct itmes一样多的字节数。
  • malloc(sizeof(*shop);按字节分配与*shopstruct store)大小相同的字节数。

3-这个宏返回什么?根据我的理解,将1添加到指针用于跳转到数组中的下一个元素,但我不了解这种情况。

是的,你是对的。首先,他们将指针指向struct items *类型,然后递增指针指向struct items *类型的下一个内存地址。为了澄清,让我们引用C11,章§6.5.6

当具有整数类型的表达式添加到或从一个指针中减去,所述 结果具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且该数组足够大,则结果指向原始元素的偏移量 ,从而使得结果数组元素和原始数组元素的下标之差等于整数表达式[....]

+1

总分配至少与所提供的值一样大(当成功时);在实践中,它总是更多(对于malloc开销)并且忽略malloc开销,它仍然可能更多(对于对齐问题)。 – mah

+1

@mah一般而言,但在标准中没有提及。 C11/7.22.3.4 _ malloc函数为大小由size_指定的对象分配空间。...... –

+0

Malloc也从OS获取内存是较大的块,以限制上下文切换。 –