2016-10-01 107 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] = ' '; 
     } 
    } 
} 

我必须做在谷歌一些搜索和解决方案是使用的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

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

你差一错误导致你的程序写入过去分配的内存块的结束,这使得指针无法使用。

请注意,使用符号常量(如HAUTEURLARGEUR)代替它们的数值也更好,即使这些值匹配。

+0

好的,我认为问题与我的分配有关,但我的朋友倒置了HAUTEUR和LARGEUR的价值...... XD非常感谢您的帮助, –