I'm confused about what is happening when I try to use calloc
as opposed to malloc
. My understanding is that calloc
allocates the memory and initializes the value at each address to zero, whereas malloc
just allocates the memory. However, when I attempt to print the values at each address I expect the values to be zero for calloc
and random characters for malloc
- But they aren't... they're the same no matter which I do.
typedef struct {
char* text;
void* obj;
} statement_t;
void* stalloc() {
return calloc(1, MODEL_OBJ_CAPACITY);
// return malloc(MODEL_OBJ_CAPACITY); Also used this
};
statement_t NewStatement(char* text) {
statement_t statement;
statement.text = text;
statement.obj = stalloc();
return statement;
};
int main(void) {
statement_t statement = NewStatement("CREATE job Manager");
for(int n = 0; n < 10; ++n) {
printf("statement[%d]: %c\n", n, (char)&statement.obj[n]); // Note I've tried a number of ways to print this but they always end up being the same
}
...
}
Output from calloc
:
statement: CREATE job Manager 0x7fb127405c60 8
statement[0]: `
statement[1]: a
statement[2]: b
statement[3]: c
statement[4]: d
statement[5]: e
statement[6]: f
statement[7]: g
statement[8]: h
statement[9]: i
Output from malloc
:
statement: CREATE job Manager 0x7f8becc05c60 8
statement[0]: `
statement[1]: a
statement[2]: b
statement[3]: c
statement[4]: d
statement[5]: e
statement[6]: f
statement[7]: g
statement[8]: h
statement[9]: i
As you can see, they are the same... What am I missing?
obj
has type of void*
. C standard does not allow any pointer arithmetics on void pointers. There is not possible to index void *
.
It is is a gcc
extension and it is not portable.
Try:
printf("statement[%zu]: %d\n", n, ((char *)statement.obj)[n]);
or
int c;
for(size_t n = 0; n < 10; ++n) {
c = ((char *)statement.obj)[n];
printf("statement[%zu]: %s : %d (0x%02x)\n", n, (c >= 32 && c <= 127) ? (char []){'\'', c, '\'', 0} : "not printable", c, c );
}