【问题标题】:What is the reason of this segmentation fault?这种分段错误的原因是什么?
【发布时间】:2013-12-14 12:43:22
【问题描述】:

考虑以下 sn-p:

void init ()
{
int i,j;
ioctl(0, TIOCGWINSZ, &w);

  X=w.ws_col;
  Y=w.ws_row - 9;
  printf("X=%d,Y=%d\n",X,Y); // X and Y looks good, 144 and 32
  getch();
  Terrain=malloc(Y);
  for(i=0;i<Y;i++)
    Terrain[i]=malloc(X);
    printf("Created terrain\n"); //OK
Terrain[6][0]=getch();
  printf("%x\n",Terrain[6][0]); getch(); //No problem accessing Terrain[6][0]
  for (i = 0; i < Y; i++)
    {
        for (j = 0; j < X-1; j++)
        {
            if ((i == 0) || (j == 0) || (j == (X - 2)) || (i == (Y - 1)))
                {printf("%d:%d\n",i,j);Terrain[i][j] = '#';printf(" '#'OK\n");} //seg fault in this line for i=6,j=0
            else
                {printf("%d:%d\n",i,j);Terrain[i][j] = ' ';printf(" '_'OK\n");}
        }
        printf("%d:%d",i,X-1);
        Terrain[i][X - 1] = '\0';printf(" 'o'OK\n");
    }
}

输出是这样的......

...

5:141

'_'好的

5:142

'#'好的

5:143 'o'OK

6:0

分段错误(核心转储)

dipto@dipto-VirtualBox:~$

如果我使用相同大小的静态数组,即 144 和 32,则没有问题。
我是否遗漏或忽略了什么?

【问题讨论】:

  • 应该是Terrain=malloc(Y * sizeof(char *))
  • 好的,但这没有帮助..
  • 通过 gdb 运行它并获得回溯,以便您知道问题出在哪一行。在分配Terrain[6] 之前,不应访问Terrain[6][0]=getch(); ..
  • @amdixon,是的,Terrain=malloc(Y * sizeof(char *)) 有效。我又犯了一个错误。非常感谢。

标签: c arrays segmentation-fault malloc


【解决方案1】:

您没有显示关键变量,例如 X,尤其是 Y。

在分配内存时,您通常需要一个乘数来计算数组每个成员的字节大小。 “short”通常需要 2。“int”现在很棘手,可以是 4 或 8。类似于 Terrain=malloc(Y*sizeof(Terrain[0])) 的东西。

如果没有乘数,您将无法分配足够的内存,并且您的生存取决于内存的分配方式以及超出实际内存末尾时会被踩到的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2016-10-18
    • 2015-04-23
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多