【问题标题】:Segmentation fault in scanning values in Dynamic array ( int **arr)扫描动态数组中的值时出现分段错误(int **arr)
【发布时间】:2017-02-27 02:46:52
【问题描述】:

此代码给出分段错误。在 GDB 调试时出现此错误:

"程序收到信号SIGSEGV,分段错误。 _IO_vfscanf_internal 中的 0x00007ffff7a6dde5 (s=, 格式=,argptr=argptr@entry=0x7fffffffdba8, errp=errp@entry=0x0) at vfscanf.c:1902 1902 vfscanf.c: 没有这样的文件或目录。 "

void  readData()
{
int **arr,m;
scanf("%d",&m);
arr = (int **)malloc(sizeof(int)*m);
    for(int i=0;i<m;i++)
    {
    arr[i] = (int *)malloc(sizeof(int) * 2);
    }
    for(int i=0;i<m;i++)
    {
    printf("..%d ..\n",i); // if m = 20 then running only 12 times
    scanf("%d %d",&arr[i][0],&arr[i][1]);

    }
}

int main()
{
readData();
}

如果 m=20 那么,第二个循环只运行了 12 次,然后给出分段错误。虽然第一个循环运行了 20 次。 请帮帮我。

【问题讨论】:

    标签: c data-structures segmentation-fault malloc dynamic-arrays


    【解决方案1】:
    arr = (int **)malloc(sizeof(int)*m);
    

    这应该是

    arr = malloc(sizeof(int*)*m);
    

    因为您需要分配 m 指针,而不是 m 整数。或者更好,

    arr = malloc(sizeof(*arr)*m);
    

    (顺便说一下,不要强制转换malloc的结果。)

    【讨论】:

    • int (*arr)[2] = malloc(m * sizeof *arr); ... 然后整个数组被分配为一个,而不是m+1调用malloc :)
    【解决方案2】:

    下面一行有问题

    arr = (int **)malloc(sizeof(int)*m);
    

    您分配 sizeof(int) 乘以 m,这应该更改为 sizeof(int *)*m 以保存地址而不是 int(这些可能具有不同的大小并可能导致问题)。所以应该是这样的

    scanf("%d",&m);
    arr = (int **)malloc(sizeof(int *)*m);
        for(int i=0;i<m;i++)
    

    【讨论】:

      猜你喜欢
      • 2016-01-21
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多