2016-10-01 15 views
-3

私はこのプログラムを起動すると、cで簡単なプログラムを作成しようとしていますが、セグメンテーションフォルトが発生します。言語C、セグメンテーションエラー

==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 

誰かがいずれかを持っていた場合:私はグーグルで、いくつかの検索を行う必要があり、溶液が私のエラーを検出するためのvalgrindのを使用することですので、私はこのリターンを得る私のコード

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] = ' '; 
     } 
    } 
} 

このエラーを修正するアイデア...

+5

'LARGEUR'と' HAUTER'の値は何ですか? – ewcz

+0

'LARGEUR'と' HAUTER'に '#define'定数を表示できますか? – 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] = ' '; 
    } 
} 

あなたのoff-by-oneエラーがポインタが使用できなくなり、割り当てられたメモリブロックの終わり、過ぎて書くためにあなたのプログラムになります。

値が一致しても数値の代わりにHAUTEURLARGEURなどの記号定数を使用する方がよいことに注意してください。

+0

ok、私の問題は私の配分にあると思うが、私の友人はHAUTEURとLARGEURの価値を逆さまにしていた... XDは助けてくれてありがとう –