#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
提示符。 然后键入run
或r
,它将运行该程序。然后它要求输入。键入您的输入值。然后发生分段错误。现在,您可以通过键入backtrace
或bt
来查看回溯。您可以查看哪条线导致崩溃。您可以通过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 " 20204 04b", errp=0x0) at vfscanf.c:840
840 *str++ = c;
(gdb) backtrace
#0 0x005c5c3d in _IO_vfscanf_internal (s=0x6d1420, format=0x804867e "%s", argptr=0xbfffe984 " 20204 04b", 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)
用于应用程序的高级调试 这可能会有所帮助