Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6370295
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 25, 20262026-05-25T00:54:43+00:00 2026-05-25T00:54:43+00:00

I have seen the following implementation of circular buffer: http://en.wikipedia.org/wiki/Circular_buffer /**< Buffer Size */

  • 0

I have seen the following implementation of circular buffer:

http://en.wikipedia.org/wiki/Circular_buffer

/**< Buffer Size */
#define BUFFER_SIZE    10
#define NUM_OF_ELEMS   (BUFFER_SIZE-1)

/**< Circular Buffer Types */
typedef unsigned char INT8U;
typedef INT8U KeyType;
typedef struct
{
    INT8U writePointer; /**< write pointer */
    INT8U readPointer;  /**< read pointer */
    INT8U size;         /**< size of circular buffer */
    KeyType keys[0];    /**< Element of circular buffer */
} CircularBuffer;

/**< Init Circular Buffer */
CircularBuffer* CircularBufferInit(CircularBuffer** pQue, int size)
{
    int sz = size*sizeof(KeyType)+sizeof(CircularBuffer);
    *pQue = (CircularBuffer*) malloc(sz);
    if(*pQue)
    {
        printf("Init CircularBuffer: keys[%d] (%d)\n", size, sz);
        (*pQue)->size=size;
        (*pQue)->writePointer = 0;
        (*pQue)->readPointer  = 0;
    }
    return *pQue;
}

int main(int argc, char *argv[])
{
    CircularBuffer* que;
    KeyType a = 101;
    int isEmpty, i;

    CircularBufferInit(&que, BUFFER_SIZE);
    ...
}

Here are the questions:

Q1> Why the code uses the following line to define variable keys?

KeyType keys[0];    /**< Element of circular buffer */

Q2> Why the code computes the size of the allocated buffer as follows:

int sz = size*sizeof(KeyType)+sizeof(CircularBuffer);

Q3> Why pQue pointing to a buffer larger than the size of CircularBuffer, but still can
directly referring to the member of it?

(*pQue)->size=size;
(*pQue)->writePointer = 0;
(*pQue)->readPointer  = 0;
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-25T00:54:44+00:00Added an answer on May 25, 2026 at 12:54 am

    The first item is just to specify that the element in the struct uses array syntax, but actually isn’t declared to be an array of any size.

    The malloc allocates the circular buffer size (which accounts for all the of non-key fields) and the key fields (size * sizeof(KeyType)). Note that keys[0] is actually of size zero, so no key field gets counted twice.

    The buffer isn’t actually larger than the size of the circular buffer, the allocation (as described above) was a one-time allocation to accommodate the circular buffer and the control elements (size, readPointer, writePointer) in one pass.

    The whole reason this works is because C doesn’t check to see if you walked off the end of an array. In a language that enforces array bounds, the first time you attempted to use this you would get something akin to Java’s ArrayOutOfBoundsException, because to use keys[0], you would have had to declare a keys array of size (at least) one, like keys[1].

    In other words, it’s a couple of C specific hacks to optimize the allocation of the buffer once, without encoding a fixed size. The reason it works is because array offset is strictly implemented as (base address + index * sizeof(array type)).

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have seen the following macro being used in OpenGL VBO implementations: #define BUFFER_OFFSET(i)
I have seen the following methods of putting JavaScript code in an <a> tag:
I have seen the following code: [DefaultValue(100)] [Description(Some descriptive field here)] public int MyProperty{...}
I have seen the following exception case several times public SomeClass(IEnumerable<T> someValues) { if
I have seen the following #include directives: #include <xstring> #include <cstring> #include <string> #include
I have seen some websites use the following tag: <meta type=title content=Title of the
I have seen a web page source code containing the following css declaration at
I have seen many articles and Questions/Answers Regarding Lock Escalation but following things are
Which of the following has the best performance? I have seen method two implemented
Can someone recommend a hosted solution that answers the following requirements (I have seen

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.