C语言 减去 malloc 返回的 2 个指针,大小为零



我有一个队列数据结构定义为(为简单起见省略了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( 关于实现定义行为的部分:

callocmallocrealloc 函数是否返回空指针或 当请求的大小为零 (7.22.3( 时指向已分配对象的指针。

因此,您必须查找特定实现的文档来回答此问题。

相关内容

  • 没有找到相关文章

最新更新