Search code examples
cmemoryfreeallocation

Why does this program crash when freeing?


I'm trying to understand why does this program crash, when I use this line and trying to free the pointer:

 t_mat *C=malloc(sizeof(t_mat));

But works well with the following line (no memory leaks, no crashing, the value 53 is the minimum I found by trial and error):

 t_mat *C=malloc(sizeof(t_mat)+53);

Program: (the while(1) loop is for memory leak testing, doesn't affect the crashing)

#include <stdio.h>
#include <stdlib.h> 
typedef int t_mat[3][3];
t_mat* matice(t_mat A, t_mat B, char op)
{
    t_mat *C=malloc(sizeof(t_mat)+53);
    switch(op)
    {
    case '+':
        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
                *C[i][j]=A[i][j]+B[i][j];
        return *C;
        break;
    case '-':
        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
                *C[i][j]=A[i][j]-B[i][j];
        return *C;
        break;
    default:
        free(C);
        printf("Chyba\n");
        return NULL;
        break;
    }
}
int main()
{
    char op;
    scanf("%c",&op);
    getchar();
    t_mat A = {0,1,2,3,4,5,6,7,8},B= {0,1,2,3,4,5,6,7,8},*C;
    while(1)
    {
        C=matice(A, B, op);
        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
                printf("%d\n",*C[i][j]);
        free(C);
        C=NULL;
    }
    return 0;
}

Am I missing something here ?


Solution

  • Unary * has lower precedence than []. You need to write (*C)[i][j].