T.Jones
T.Jones

Reputation: 55

Pointer to a Pointer to a Structure and malloc memory for array

I'm creating a pointer to a pointer to a structure to create a dynamic array with malloc in C, but I get a segmentation fault calling the struct array. Here is a quick rundown of my code:

#include <stdio.h>

typedef struct {
    int test1;
    int test2;
    }testStruct;

int main() {
    testStruct **neato;

    neato = (testStruct **) malloc( sizeof(testStruct *) * 5);
    // Array of 5 for convience

    // any neato[x]->testy call results in segmentation fault.
    scanf("%d", &neato[0]->test1);    // Segmentation fault

    return 0;
    }

I tried other calls like (*neato)[0].test1 and all result in segmentation fault. This is obviously not the proper way to do this or my GNU compiler is seriously outdated.

Upvotes: 2

Views: 223

Answers (3)

Ed Swangren
Ed Swangren

Reputation: 124642

You've allocated enough memory for 5 pointers. You have not however initialized the pointers, so they are garbage. Allocate the pointers and then proceed to initialize each pointer.

int elems = 5;

neato = malloc(sizeof(testStruct *) * elems);
for( i = 0; i < elems; ++i ) {
    neato[i] = malloc(sizeof(testStruct));
}

On a side note, I don't see a need for an array of pointers here. Why not simply allocate enough space for 5 testStructs (i.e., neato becomes a testStruct*) and pass the address of that pointer to the function that initializes it?

Upvotes: 5

asaelr
asaelr

Reputation: 5456

You allocated array of pointers, but did not assign valid address to these pointers.

If you only want to create dynamic array, use just pointer to the struct:

testStruct *neato;
neato = malloc( sizeof(testStruct) * 5);
scanf("%d", &neato[0].test1);

Upvotes: 0

twain249
twain249

Reputation: 5706

you aren't mallocing space for all the structures themselves you have to add

for(int i = 0; i < 5; i++) {
    neato[i] = malloc(sizeof(testStruct));
}

After you malloc neato. Also you should check your return value from malloc for NULL to make sure malloc passed.

Upvotes: 0

Related Questions