Язык C, ошибка сегментации

#c

#c

Вопрос:

я пытаюсь создать простую программу на c, и при запуске этой программы я получаю ошибку сегментации 11.

это мой код

 int main()
{


    char** tab = NULL, i;

    tab = malloc(HAUTEUR * sizeof(char*));
    for(i = 0; i < HAUTEUR; i  )
        tab[i] = malloc(LARGEUR * sizeof(char));   

    initialiseGrille(tab);

    for(i = 0; i < HAUTEUR; i  )
        free(tab[i]);
    free(tab);
}



void initialiseGrille( char** aGrid)
{
    for(int x=1; x <= 15; x  )
    {
        for(int y=1;y <= 10; y  )
        {
            aGrid[x][y] = ' ';
        }
    }
}
  

Я провел некоторый поиск в Google, и решение состоит в том, чтобы использовать valgrind для обнаружения моей ошибки, поэтому я получаю этот результат :

 ==3008== Memcheck, a memory error detector
==3008== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==3008== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==3008== Command: ./a.out
==3008== 
==3008== Invalid read of size 8
==3008==    at 0x100000B7C: initialiseGrille (in ./a.out)
==3008==    by 0x100000AEE: main (in ./a.out)
==3008==  Address 0x100011fd0 is 0 bytes after a block of size 80 alloc'd
==3008==    at 0x640B: malloc (in /usr/local/Cellar/valgrind/3.11.0_1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==3008==    by 0x100000AA5: main (in ./a.out)
==3008== 
==3008== Invalid write of size 1
==3008==    at 0x100000B80: initialiseGrille (in ./a.out)
==3008==    by 0x100000AEE: main (in ./a.out)
==3008==  Address 0x1 is not stack'd, malloc'd or (recently) free'd
==3008== 
==3008== 
==3008== Process terminating with default action of signal 11 (SIGSEGV)
==3008==  Access not within mapped region at address 0x1
==3008==    at 0x100000B80: initialiseGrille (in ./a.out)
==3008==    by 0x100000AEE: main (in ./a.out)
==3008==  If you believe this happened as a result of a stack
==3008==  overflow in your program's main thread (unlikely but
==3008==  possible), you can try to increase the size of the
==3008==  main thread stack using the --main-stacksize= flag.
==3008==  The main thread stack size used in this run was 8388608.
==3008== 
==3008== HEAP SUMMARY:
==3008==     in use at exit: 25,108 bytes in 381 blocks
==3008==   total heap usage: 457 allocs, 76 frees, 31,052 bytes allocated
==3008== 
==3008== LEAK SUMMARY:
==3008==    definitely lost: 0 bytes in 0 blocks
==3008==    indirectly lost: 0 bytes in 0 blocks
==3008==      possibly lost: 0 bytes in 0 blocks
==3008==    still reachable: 230 bytes in 11 blocks
==3008==         suppressed: 24,878 bytes in 370 blocks
==3008== Rerun with --leak-check=full to see details of leaked memory
==3008== 
==3008== For counts of detected and suppressed errors, rerun with: -v
==3008== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 1 from 1)
Segmentation fault: 11
  

если у кого-нибудь была идея исправить эту ошибку…

Комментарии:

1. каково значение LARGEUR и HAUTER ?

2. Можете ли вы показать #define константы для LARGEUR и HAUTER ?

Ответ №1:

Индексация в C основана на нуле, даже для массивов, которые вы выделяете динамически. Следовательно, этот код

 for(int x=1; x <= 15; x  ) {
    for(int y=1;y <= 10; y  ) {
        aGrid[x][y] = ' ';
    }
}
  

должно быть переписано следующим образом:

 for(int x=0 ; x < HAUTEUR ; x  ) {
    for(int y=0 ; y < LARGEUR ; y  ) {
        aGrid[x][y] = ' ';
    }
}
  

Ваша случайная ошибка приводит к тому, что ваша программа записывает после конца выделенных блоков памяти, что делает указатели непригодными для использования.

Обратите внимание, что также лучше использовать символьные константы, такие как HAUTEUR и LARGEUR , вместо их числовых значений, даже если значения совпадают.

Комментарии:

1. хорошо, я думаю, что проблема в моем распределении, но у моего друга было инвертированное значение HAUTEUR и LARGER … XD большое спасибо, что помогли мне