I can not figure out what the heck is happening here. What I expect is that the output should say that there is only 1 element in keys, it's saying there are 7 when I have allocated only the 0 position with 120 bytes.
void add2(char **b, char *i) {
    if (!i) {
        b[0] = (char*) malloc(120);
        sprintf(b[0], "%s", "hithere");
    } else {
        strcat(b[0], "\\\\");
        strcat(b[0], i);
    }
}
void add1(char **b) {
    add2(b, NULL);
    add2(b, "one");
    add2(b, "two");
    add2(b, "three");
}
void add() {
    char *keys[2];
    int i;
    add1(keys);
    fprintf(stderr, "%s\n", keys[0]);
    for (i = 0; keys[i]; i++)
        fprintf(stderr, "%d\n", i);
    free(keys[0]);
}
int main (int argc, char** argv)
{   
     add();
     add();
     return 255;
}
outputs: hithere\one\two\three 0 1 2 3 4 5 6 7 hithere\one\two\three 0 1 2 3 4 5 6 7
the strings are as I expect them to be however i thought only 0 should be printed out after since 0 is the only element I added to. I need to be able to free each spot instead of just free[0] but when i put the free[i] in the for loop that prints out i it stack dumps.
with regard to initialization from response below, if i need an array that is like 1000 instead of 2 then how do i init them all to 0 without typing out 1,000 0's