C语言 分段错误


#include <stdio.h>

int main(void)
{
/* an array with 5 rows and 2 columns*/
char* a[5][2];
int y, p;
for(y = 0; y < 5; y++)
{
for(p = 0; p < 2; p++)
{
scanf("%s", a[y][p]);
}                      
}       
int i, j;
/* output each array element's value */
for ( i = 0; i < 5; i++ ) 
{            
for ( j = 0; j < 2; j++ ) 
{
printf("a[%d][%d] = %sn", i,j, a[i][j] );
}
}
return 0;        
}

插入 2 个字符串后,我一直收到一个分段错误作为该程序的输出。谁能告诉我我的代码出了什么问题?

问题:

您在此处声明了 10 个未初始化的指针:

char* a[5][2];

然后尝试用数据填充它们:

scanf("%s", a[y][p]);

这是错误的。您需要在复制数据之前分配内存。

溶液:

我会以更性感的方式做到这一点,但快速的解决方案是:

#define MAX_LEN 100
char a[5][2][MAX_LEN];
/* ... */
scanf("%s", a[y][p][0]);

只是帮助故障排除的提示。希望这对未来的新手有所帮助。

解决分段错误的更好方法是使用调试器(如gdb(运行它。

例如 使用 gdb 编译程序(您需要在主机上安装 gdb(

gcc -ggdb Test.c -o Test

然后用 gdb 运行它

gdb ./Test

在您的情况下,您将看到这样的输出。它将转到gdb提示符。 然后键入runr,它将运行该程序。然后它要求输入。键入您的输入值。然后发生分段错误。现在,您可以通过键入backtracebt来查看回溯。您可以查看哪条线导致崩溃。您可以通过list查看代码。您可以通过键入list <line>转到任何行。浏览 GDB 指南以了解更多命令。

它尝试访问指针,可能无效,这就是它崩溃的原因。然后找出它无效的原因。可能您没有初始化它或没有分配内存。因此,最简单的解决方法是将其声明为数组(而不是指针数组(,就像他的回答中提到的@Andrewjs的那样。

Reading symbols from /tmp/Examples/Test...done.
(gdb) run
Starting program: /tmp/Examples/Test
for 1
for 2
10
Program received signal SIGSEGV, Segmentation fault.
0x005c5c3d in _IO_vfscanf_internal (s=0x6d1420, format=0x804867e "%s", argptr=0xbfffe984 "2020404b", errp=0x0) at vfscanf.c:840
840                           *str++ = c;
(gdb) backtrace
#0  0x005c5c3d in _IO_vfscanf_internal (s=0x6d1420, format=0x804867e "%s", argptr=0xbfffe984 "2020404b", errp=0x0) at vfscanf.c:840
#1  0x005cebbb in __scanf (format=0x804867e "%s") at scanf.c:35
#2  0x0804850d in main () at Test.c:16   <-- Your program's last call
(gdb) list
835                       }
836     #else
837                       /* This is easy.  */
838                       if (!(flags & SUPPRESS))
839                         {
840                           *str++ = c;    <-- Crash point
841                           if ((flags & MALLOC)
842                               && (char *) str == *strptr + strsize)
843                             {
844                               /* Enlarge the buffer.  */
(gdb)

用于应用程序的高级调试 这可能会有所帮助

相关内容

  • 没有找到相关文章

最新更新