I’m still new to C, malloc, and all that jazz, so I decided to write this to learn some more skills. The idea is, I’m reading in a bunch of ints from a file and putting them into a matrix (2d array). The start of the file says how many rows and columns there are, so it reads those numbers in and uses malloc to set up the 2d array.
int read_matrix(FILE *mat, int ***Z, int *x, int *y)
{
int i = 0;
int x_temp = 0;
int y_temp = 0;
if (fscanf(mat, "%d %d", &(*x), &(*y)) == EOF){
printf("File is not big enough to contain a matrix\n");
return -1;
}
printf("About to malloc %d\n", *x);
*Z = (int**) malloc(*x * sizeof(int*));
while (i < *x) {
printf("mallocing %d\n", i);
*Z[i] = (int*) malloc(*y * sizeof(int));
printf("malloced\n");
++i;
}
printf("Malloc complete\n");
/*Other unimportant code*/
}
The output reads:
About to malloc 3
mallocing 0
malloced
mallocing 1
Segmentation fault
So it’s not mallocing anything but one int** in Z.. I think?
I’m very new to C, so I’m not sure if I’ve made some little mistake, or if I’m really going about this whole thing incorrectly. Any thoughts? Thanks!
The
[]operator binds more closely than the unary*operator. Try changing*Z[i]to(*Z)[i]and see if your code behaves.As a side note, it’s also quite common in C to malloc a single array of (sizex*sizey) size, for a matrix and then index it as arr[x*sizey + y] or arr[y*sizex + x]. That more closely mimics what the language does with static arrays (e.g. if you declare
int foo[10][10], all 100 ints are contiguous in memory and nowhere is a list of 10 int*’s stored.