core dumped error from 2D malloc array

Odpowiedz Nowy wątek
2019-08-08 07:42
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;
}

Pozostało 580 znaków

2019-08-08 07:57
2

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


edytowany 1x, ostatnio: Patryk27, 2019-08-08 08:08

Pozostało 580 znaków

2019-08-08 08:07
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


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie

Pozostało 580 znaków

2019-08-08 08:14
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 " [] "

Pozostało 580 znaków

2019-08-08 09:00
0

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


Użycie trigrafów prawie na pewno wymaga dodania opcji przy kompilacji. Poza tym to chyba nie poprawiłoby czytelności... a??(i??) = 10; - Bartłomiej Golenko 2019-08-08 10:21

Pozostało 580 znaków

2019-08-08 10:26
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.

edytowany 1x, ostatnio: Bartłomiej Golenko, 2019-08-08 10:31
Przed C11 trzeba być ostrożnym z rzutowaniem malloca, bo możesz ukryć sobie tym niechcący ostrzeżenie kompilatora. Ogólnie w C popularną praktyką jest unikanie castowania w tym przypadku. - sugar_hiccup 2019-08-08 11:50
Hmm ? W jakiej sytuacji ? - Bartłomiej Golenko 2019-08-08 17:14
To chyba problem opcji kompilatora a nie rzutowania... https://4programmers.net/Pastebin/11339 - Bartłomiej Golenko 2019-08-08 18:03
To jest problem, na który trzeba uważać, bo istnieje implicit int i nikt nie zmusza twórców kompilatora do rzuca warningami jak robi to gcc. - sugar_hiccup 2019-08-08 18:07
Ale czyż to nie dotyczy wszystkich warningów tak samo? Przed konwersją z int na int* kompilator chyba też nie musi ostrzegać. Tego typu błędy powinna zresztą wyłapać każda, nawet najbardziej prymitywna, statyczna analiza kodu. - Bartłomiej Golenko 2019-08-09 01:52

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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