Search code examples
carraysdynamic-allocation

c: issues when allocating 2d char array dynamically?


I'm trying to allocate a 2D char array to be accessed like ary[i][j], using this code:

#define stringmaxlen 20

void do_alloc( char ***vals, int valscount ){
    *vals = (char**) calloc( sizeof( char** ), valscount );
    int i = 0;
    for ( ; i<valscount; i++ )
        *vals[i] = (char*) calloc( sizeof( char* ), stringmaxlen );
}

int main( ){
    //......
    char** ary;
    do_alloc( &ary, 10 );
    strcpy( ary[0], "test" );
    //......
}

Unfortunately, this causes an overflow somewhere and the program have a bug in execution, I got some references from here for the dynamic allocation: http://staff.science.nus.edu.sg/~phywjs/CZ1102/lecture20/sld014.htm.

I like to know what's wrong here and how to solve the issue, thanks.


Solution

  • You got the operator precedence wrong: *vals[i] evaluates as *(vals[i]), not as (*vals)[i]. See http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence for details.

    The fix is to change *vals[i] to (*vals)[i].

    Also, the allocation *vals[i] = (char*) calloc( sizeof( char* ), stringmaxlen ); is wrong. It allocates way too much memory because it allocates space for stringmaxlen pointers, but you need only stringmaxlen characters.