UncleLeroy 49 Junior Poster in Training

sizeof() is not an issue if you use ->next as recommended above, however, here are some details:
1) sizeof() is returning the number of bytes you used (4 + 15 + 4 + 4) = 27,
but the compiler rounds up to a multiple of 3, 8, 16, or 32, depending on options.
You can expect the compiler (and malloc()) to reserve an arbitrary number of bytes (zero or more) than you requested.

2) You cannot assume that multiple calls to malloc() return equally-spaced pointers. You must treat each allocated block as if it was randomly located relative to the other blocks.

UncleLeroy 49 Junior Poster in Training

The pointer version is fairly simple,too:

CITIZEN *cit_ptr = &cit[0];
for (x = 0; x < size; x++, cit_ptr++) {
  insert_personal_info(cit_ptr);
  display_cit(cit_ptr);
}
UncleLeroy 49 Junior Poster in Training

6-byte alignment is rare, I assume you want a generic reply. It could depend on integer divide, which always truncates (never rounds). Avoid negative numbers by using unsigned. The first problem is the length of a pointer, which can be up to 64 bits long. Here is a generalized example

unsigned long long alignment = 6;
unsigned long long addr = (unsigned long long) pointer; // not assumed to be aligned.
addr = pointer / alignment; // Aligned (also divided by 6)
addr++;                     // Next aligned pointer (still divided by 6)
addr *= alignment;          // Next aligned pointer
pointer = (thepointertype *) addr;

It should work for any arbitrary alignment (such as 1, 5, 7, 64, or 12345).
Getting the compiler to generate structures with 6-byte alignment is harder, and the pointer may not actually be useful (perhaps to point to a string?).

UncleLeroy 49 Junior Poster in Training

This program is well organized, a good example for others using this forum. It has readable field names (such as "address"), and short, well defined functions that can be improved later without rewriting everything else. And I don't see any errors in the logic.

It makes assumptions (array sizes, etc), which is OK for homework.

I agree it is a good idea to accept more than one citizen. An array[10] of structures is a simple way to do that, but the program should avoid putting 11 items into it.

UncleLeroy 49 Junior Poster in Training

The "bzero" in the loop is redundant and can be deleted.
It is also overflowing the allocated buffer size of "ffull".