2

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.

T.Jones
  • 45
  • 4

3 Answers3

5

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?

Ed S.
  • 122,712
  • 22
  • 185
  • 265
0

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.

twain249
  • 5,666
  • 1
  • 21
  • 26
  • No need to cast the result of `malloc` in C. – Ed S. Apr 05 '12 at 02:42
  • @EdS. True but it doesn't hurt. – twain249 Apr 05 '12 at 02:44
  • It can actually. It's just totally unnecessary, serving only to add verbosity to your code, and it can actually be bad in a more meaningful way. See: http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – Ed S. Apr 05 '12 at 02:44
0

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);
asaelr
  • 5,438
  • 1
  • 16
  • 22