gpt4 book ai didi

c - C语言,段错误

转载 作者:行者123 更新时间:2023-11-30 21:08:13 25 4
gpt4 key购买 nike

我正在尝试用 c 创建一个简单的程序,当我启动该程序时,出现段错误 11。

这是我的代码

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

如果有人有任何想法来纠正这个错误......

最佳答案

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)代替它们的数值,即使值匹配。

关于c - C语言,段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39805423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com