【发布时间】:2016-12-20 18:11:25
【问题描述】:
我知道这有点基础,但我被困在这上面。 我一直在尝试制作数独游戏。参数将通过将它们传递给 main 来给出。当尝试将它们写入不同的数组时,而不是 **argv 数组,当增加一个整数变量时,它会给我一个分段错误。
int **ft_copy_sudoku(int argc, char **argv)
{
int **sudoku_arr;
int index;
int s_index;
int j;
printf("%d", argc);
sudoku_arr = (int **)malloc(sizeof(int) * 9 * 9);
index = 1;
while (index < argc)
{
j = 0;
s_index = 0;
//sudoku_array[s_index] = (int *)malloc(sizeof(int) * 9);
while (j < 9)
{
if (argv[index][j] >= '1' && argv[index][j] <= '9')
sudoku_arr[s_index][j] = argv[index][j] - '0';
else
argv[index][j] = 0;
j++;
s_index++;
}
index++;
}
return sudoku_arr;
}
void ft_print_sudoku(int **sudoku)
{
int i;
int j;
i = 0;
while (i < 9)
{
j = 0;
while (j < 9)
{
printf("%d ", sudoku[i][j]);
j++;
}
i++;
printf("\n");
}
}
int main(int argc, char **argv)
{
ft_print_sudoku(ft_copy_sudoku(argc, argv));
return (0);
}
使用 gdb 进行调试时,我收到以下消息。
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000000000004007a6 in ft_print_sudoku (sudoku=0x1060420) at puzzle.c:62
62 j++;
【问题讨论】:
-
请问
puzzle.c:62是哪一行? -
这是我帖子的最后一行。 j++;。我删除了那个,现在有问题的行是第 39 行。 sudoku_arr[s_index][j] = argv[index][j];
-
调试器应该能够告诉您更多信息,不仅是发生故障的行,而且您可以打印所有变量的内容,例如
j,以准确了解当你的程序崩溃了。 -
你在这方面的多级间接是完全错误的。您正在为 81 个
int值分配空间。仅仅因为您将malloc的结果保存为int**并不意味着您可以将该分配视为指针数组;不是这样的。
标签: c pointers segmentation-fault gdb core