2016-10-01 2 views
-3

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

, что мой код

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 

если кто-то любой идея исправить эту ошибку ...

+5

Какова ценность 'LARGEUR' и' HAUTER'? – ewcz

+0

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

ответ

0

Индексирование в 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, вместо их числовых значений, даже если значения совпадают.

+0

хорошо, я думаю, проблема связана с моим распределением, но мой друг имел инвертированное значение HAUTEUR и LARGEUR ... XD благодарит вас за то, что помогло мне –

Смежные вопросы