#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 большое спасибо, что помогли мне