我有一个队列数据结构定义为(为简单起见省略了NULL
检查(
struct ml_queue {
void *buf;
void *next_elemnt;
size_t size;
}
struct ml_queue *ml_queue_alloc(size_t size){
struct ml_queue *mq_ptr = malloc(sizeof(*mq_ptr));
void *buf = malloc(size);
ml_queue->buf = buf;
ml_queue->size = size;
ml_queue->next_element = buf;
return ml_queue;
}
bool ml_queue_is_empty(struct ml_queue *queue){
char *buf = queue->buf;
char *next = queue->next;
char *limit = buf + queue->size;
return limit - buf > 0; //Here is the question
}
我不确定的是,在使用零大小队列时,这样的实现是否会导致 UB。喜欢
struct ml_queue *q = ml_queue_alloc(0);
bool is_empty = ml_queue_is_empty(q); //UB?
众所周知,malloc
返回作为参数传递的大小对象。根据定义,数组不能为空。
但是我们可以认为malloc(0)
分配了一个具有 1 个元素的零大小对象的数组吗?该对象在标准第3.15节中定义为
执行环境中数据存储的区域,内容 可以表示值
未指定它可以为空。虽然数组和结构都不能由零个成员组成。
malloc(0)
返回的是实现定义的行为。
根据 C11 标准 (n1570( 关于实现定义行为的部分:
calloc
、malloc
和realloc
函数是否返回空指针或 当请求的大小为零 (7.22.3( 时指向已分配对象的指针。
因此,您必须查找特定实现的文档来回答此问题。