繁体   English   中英

2D阵列分割错误

[英]segmentation fault for 2D arrays

我想定义一个很大的二维数组。 但这给我细分错误吗?

  #include <stdio.h>

  int main () {
       int i;
       int temp[4000][5000];
      for (i = 0; i < 5; i++)
      {
          printf ("Hello World\n");
      }
  }

有人可以以其他方式建议我吗? 内存初始化有问题吗? 提前致谢

您只能在一个数组中分配整个表,但无法使用两个方括号访问带有索引的数组数据:

int * temp = malloc(4000*5000*sizeof(int));

访问以前在其中写入temp[i][j]的元素(i,j),现在您应该通过以下方式计算索引:

temp[i*5000+j];

并且不要忘记以后释放为表分配的内存:

free(temp);
int temp[4000][5000];

那是一个非常大的数组,比正常的堆栈大得多,由于堆栈溢出 ,您会遇到分段错误。 考虑改用动态分配。

您需要为这样的大数组使用动态分配的数组。

尝试:

int* temp[4000];
for(i = 0; i < 4000; ++i) temp[i] = malloc(5000 * sizeof(int));
...
for(i = 0; i < 4000; ++i) free(temp[i]).

带有错误检查的整个程序:

int main () {
    int i, j;
    int* temp[4000];
    for (i = 0; i < 4000; ++i)
    {
        temp[i] = malloc(5000 * sizeof(int));
        if (temp[i] == NULL)
        {
            for (j = 0; j < i; ++j) free(temp[i]);
            exit(1);
        }
    }
    for (i = 0; i < 5; i++)
    {
        printf ("Hello World\n");
    }

    for (i = 0; i < 4000; ++i) free(temp[i]);
}

在这里,您可以找到使用单个malloc调用分配二维数组的函数。

和我自己的更简单的版本:

int main () {
    int i, j;
    int* temp[4000];
    int* array = malloc(4000 * 5000 * sizeof(int));
    if (malloc_tmp == NULL) exit(1);
    for (i = 0; i < 4000; ++i)
    {
        temp[i] = array + (i * 5000);
    }
    for (i = 0; i < 5; i++)
    {
        printf ("Hello World\n");
    }

    free(temp[0]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM