I want to use structs like objects in C.
Suppose I have the following:
typedef struct {
    /* ... */
    size_t *pages_len;
} book;
And I use the following method to construct it:
int book_init(/* some args... */, book * b) {
    /* do some validation */
    /* compute the number of pages n_pages */
    b->pages_len = (size_t*) calloc(n_pages, sizeof(size_t));
    /* compute pages_len based on some args */
    return 0;
}
Then I construct an object like this:
book *my_book = (book*)malloc(sizeof(my_book));
if (book_init(/* some args */, my_book) == 0) {
    /* do something */
}
And I destroy my object like: book_destroy(book *b) where I free(b->pages_len).
Is this correct or am I missing something? I can't show the original code but I am having trouble:
- Accessing b->pages_lenafter the init method.
- Destroying the object. I am having memory corruption.
As requested, a minimal reproducible example:
/* book.h */
#ifndef BOOK_HEADER_
#define BOOK_HEADER_
#include <ctype.h>
typedef struct
{
  size_t pages_count;
  size_t *pages_len;
} * book;
int book_create (book b);
#endif /* BOOK_HEADER_ */
/* book.c */
#include "book"
int
book_create (book b)
{
  b->pages_len = calloc (3, sizeof (b->pages_len));
  b->pages_len[2] = 20;
  return 0;
}
/* test.c */
#include "book.h"
int main(int argc, char** argv) {
  book my_book = (book)malloc (sizeof (book));
  int r = book_create (my_book);
  printf ("\n%lu\n", my_book->pages_len[2]);
  free (my_book->pages_len);
  free (my_book);
}
What I get from my memory leak detector is that free(my_book) gives a Memory corruption (written out of bounds?) error. One thing that fixed this error was changing the order of pages_count and pages_len but I don't know why.
I just typed the above example, so if there is any typo or syntactic error, please let me know. Thank you.
