我正在尝试用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
如果有人有任何想法纠正这个错误......
答案 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错误会导致你的程序写入超过已分配内存块的末尾,这会使指针无法使用。
请注意,使用符号常量(例如HAUTEUR
和LARGEUR
)代替其数值也更好,即使值匹配也是如此。