Search code examples
cmallocdynamic-memory-allocationlocal-variables

Save pointer to array in struct


Save pointer to array in struct. I would like to store the pointer to array of int into struct but I am having trouble.

Below my code with commentaries:

typedef struct _index {
    int *data;
} Index;

void adder(struct _index *s){
    int i;
    int arr[maxint];
    for(i=0; i<maxint; i++) {
        arr[i] = i+42;
    }

    //i got a gibberish
    //s->data = arr;

    //works fine
    s->data = (int *) malloc(maxint * sizeof(int));
    s->data = memcpy(s->data, arr, maxint * sizeof(int));
)

int main() {
    Index n;
    int i;

    //this method also works.
    //int arr[maxint];
    //for(i=0; i<maxint; i++) {
    //  arr[i] = i+42;
    //  
    //}
    //n.data = arr; 

    adder(&n);
    for(i=0; i<maxint;i++) {
        printf("%d-", n.data[i]);
    }//testing
    return 0;
}

when i make assignment, i got strange numbers: 117-118-119-120-12-0-22-2292964-0-2293008-127-0-129-130-131-0-0-0-0-0-0-138-0

but if i use malloc and memcpy all works fine


Solution

  • You got gibberish in your first case, because you tried to "return" the address of a local variable from a function through the pointer. Once the function finishes execution, the int arr[maxint]; won't be valid. In other words, after adder() finishes execution, int arr[maxint]; goes out of scope and it's lifetime is over. So, the (returned) pointer becomes invalid and using that further in the caller function will result in undefined behaviour.

    Solution:

    1. As you've done correctly, using dynamic memory.
    2. use static variable (not a good approach, but possible).

    In both the aforesaid approach, the lifetime of the variable ( static arr array/ malloc()ed memory) is not limited to function scope and thus, the pointer to the meory will be vaild in the caller function.