What is a good way to ensure that allocated memory is initialized to a value? I know one can follow strict coding practices but I'm wondering how one can ensure allocated memory is properly initialized?
I tried the code below:
Code:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define ARR_SIZE 5
typedef bool SET;
void check_allocation(void * ptr) {
if (!ptr) {
fputs("Allocation Failed!\n", stderr);
exit(1);
}
}
struct valid_memory {
SET set;
int * value;
};
int main(int argc, char ** argv) {
struct valid_memory vm[ARR_SIZE] = {
{false, NULL},
{false, NULL},
{false, NULL},
{false, NULL},
{false, NULL}
};
for (size_t i = 0; i < ARR_SIZE; ++i) {
if (vm[i].set) {
fprintf(stdout, "set: %s, ptr: %p\n", vm[i].set ? "true" : "false", (void*)vm[i].value);
}else {
fprintf(stdout, "set: %s\n", vm[i].set ? "true" : "false");
}
}
for (size_t i = 0; i < ARR_SIZE; ++i) {
vm[i].value = malloc(sizeof(*vm[i].value));
check_allocation(vm[i].value);
*vm[i].value = i;
vm[i].set = true;
}
for (size_t i = 0; i < ARR_SIZE; ++i) {
if (vm[i].set) {
fprintf(stdout, "set: %s, ptr: %p, value: %d\n", vm[i].set ? "true" : "false", (void*)vm[i].value, *vm[i].value);
}else {
fprintf(stdout, "set: %s\n", vm[i].set ? "true" : "false");
}
}
for (size_t i = 0; i < ARR_SIZE; ++i) {
free(vm[i].value);
vm[i].value = NULL;
vm[i].set = false;
}
for (size_t i = 0; i < ARR_SIZE; ++i) {
if (vm[i].set) {
fprintf(stdout, "--set: %s, ptr: %p, value: %d\n", vm[i].set ? "true" : "false", (void*)vm[i].value, *vm[i].value);
}else {
fprintf(stdout, "set: %s\n", vm[i].set ? "true" : "false");
}
}
return 0;
}
Output from the above:
set: false
set: false
set: false
set: false
set: false
set: true, ptr: 0000000000BD13E0, value: 0
set: true, ptr: 0000000000BD1400, value: 1
set: true, ptr: 0000000000BD1420, value: 2
set: true, ptr: 0000000000BD1440, value: 3
set: true, ptr: 0000000000BD1460, value: 4
set: false
set: false
set: false
set: false
set: false
This problem seems simple at first but with some reflection it really exposes how dangerous C programming can get.