簡體   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