core dumped error from 2D malloc array

0

Why is there Segmentation fault(core dumped).

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int **a = malloc(10*sizeof(int*));
    if( a == NULL )
    {
        printf("Failed to allocate memory\n");
        return 8;
    }

    for(int i = 0; i < 10; i++)
    {
        *(a+i) = malloc(10*sizeof(int));
        if( (*a+i) == NULL )
        {
            printf("Failed to allocate memory\n");
            for(int i = 0; i < 10; i++)
            {
                free(*(a+i));
            }
            free(a);
            return 8;
        }
    }

    for (int i = 0; i < 10; i++)
    {
        for(int j = 0; j < 10; j++)
        {
            *(*a+j+i) = (i+1)*(j+1);
        }
    }
    
    for (int i = 0; i < 10; i++)
    {
        for(int j = 0; j < 10; j++)
        {
            if(*(*a+i+j)<100)
            {
                if(*(*a+i+j)<10)
                {
                    printf("  %d ", *(*a+i+j));
                }
                else
                {
                    printf(" %d ", *(*a+i+j));
                }
                
            }
            else
            {
                printf("%d ", *(*a+i+j));
            }
        }
        printf("\n");
    }
    for(int i = 0; i < 10; i++)
    {
        free(*(a+i));
    }
    free(a);
    return 0;
}
2

*(*a+j+i) - to nie powinno być czymś w stylu *(*(a+j)+i)?

3

Użyj normalnie a[j] zamiast bawić się w zapisy typu a + j, oznacza to samo, wygeneruje taki sam kod wynikowy, a będzie czytelniej i mniejsze p-stwo błedu. A poprawić powinna zmiana zaproponowana przez @Patryk27

0

Faktycznie, pomogło dziękuje. Gdybym mógł to bym używał problem w tym że szkolna aplikacja do testów w tym zadaniu nie przyjmuje " [] "

0

Zamiast [ spróbuj ??( oraz ??) w miejsce ] (https://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C) ;-)

1

Poza uwagami na które już Ci zwrócono uwagę:
Masz błąd w obsłudze błędu alokacji pamięci (19-22).

    for(int i = 0; i < 10; i++)
    {
        *(a+i) = malloc(10*sizeof(int));
        if( (*a+i) == NULL )
        {
            printf("Failed to allocate memory\n");
            for(int i = 0; i < 10; i++)
            {
                free(*(a+i));
            }
            free(a);
            return 8;
        }
    }

To że używasz tej samej zmiennej sterującej w wewnętrznej pętli to drobiazg, gorzej że robisz free dla wszystkich 10 elementów a nie tylko dla tych które wcześniej zaalokowałeś (free na niezaalokowanej pamięci jest legalne tylko jeśli to jest free(NULL))

       The free() function frees the memory space pointed  to  by  ptr,  which
       must  have  been  returned by a previous call to malloc(), calloc(), or
       realloc().  Otherwise, or if free(ptr) has already been called  before,
       undefined behavior occurs.  If ptr is NULL, no operation is performed.

No i jeszcze jeden drobiazg - w języku C to co prawda nie jest wymagane, ale chyba dobrym zwyczajem jest unikanie niejawnej konwersji z (void*).
Proponowałbym przy malloc dodać jawne rzutowanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1