引用GCC 文档(强调我的):
malloc属性用于告诉编译器一个函数可以被视为它返回的任何非 NULL 指针不能为函数返回时有效的任何其他指针加上别名,并且内存具有未定义的内容。这通常会改善优化。具有此属性的标准函数包括
malloc
和calloc
。realloc
-like 函数没有此属性,因为指向的内存没有未定义的内容。
我有以下代码:
struct buffer {
size_t alloc; // Allocated memory in bytes
size_t size; // Actual data size in bytes
char data[]; // Flexible array member
};
#define ARRAY_SIZE <initial_value>
buffer *buffer_new(void) __attribute__((malloc))
{
struct buffer *ret;
ret = malloc(sizeof(struct buffer) + ARRAY_SIZE);
if (!ret)
fatal(E_OUT_OF_MEMORY);
ret->alloc = ARRAY_SIZE;
ret->size = 0;
return ret;
}
现在我在这里有点疑惑:虽然我没有初始化data
成员,但我仍然将alloc
andsize
字段设置为各自的值。我仍然可以认为这个分配的段是“未定义的内容”并使用malloc属性吗?