语言C,分段错误

时间:2016-10-01 10:18:13

标签: c

我正在尝试用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] = ' ';
        }
    }
}

我在谷歌做了一些搜索,解决方法是使用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 个答案:

答案 0 :(得分: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)代替其数值也更好,即使值匹配也是如此。