簡體   English   中英

C中二維數組動態分配時的分段錯誤

[英]Segmentation fault while dynamic allocation of 2D array in C

我是C編程的新手(經過很長時間的重新學習)。 我正在嘗試使用malloc動態地將內存分配給2D數組。 我曾嘗試以下像計算器的答案這個這個 但我仍然得到分段錯誤。

我的代碼如下

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

void allocate2DArray(int **subset, int a, int b)
{
  subset = (int **)malloc( a * sizeof(int *));
  int i,j;

  for(i = 0 ; i < a ; i++)
    subset[i] = (int *) malloc( b * sizeof(int));

  for(i = 0 ; i < a ; i++)
     for(j = 0 ; j < b ; j++)
        subset[i][j] = 0;
}

int main()
{
  int **subset;
  int  a = 4, b = 4;
  allocate2DArray(subset, a, b);
  int i,j;
  for( i = 0 ; i < a  ; i++)
  { 
     for( j = 0 ; j < b ; j++)
     {
        printf("%d ", subset[i][j]);
     }
     printf("\n");
  }
} 

當我注釋行來打印數組時,它不會給出任何錯誤,程序執行時沒有分段錯誤。 請幫我理解我哪里錯了。

計算機科學中的所有問題都可以通過另一層次的間接來解決

void allocate2DArray(int ***p, int a, int b)
{
    int **subset;
    *p = (int **) malloc(a * sizeof(int *));
    subset = *p;

// ...
allocate2DArray(&subset, a, b);

您必須將int ***subset傳遞給分配函數。 這是因為參數是按值傳遞的。

你需要這個:

void allocate2DArray(int ***subset, int a, int b)

和這個:

allocate2DArray(&subset, a, b);

通過使用int **subset; 它不會成為2D陣列。 它仍然是1D存儲,只是指向指針。

2D數組意味着指針緩沖區的每個元素必須指向由ctn建議的緩沖區。 他建議*** ptr和* ptr是malloced,它創建了第一維緩沖區。 現在當你再次調用allocate2DArray()子集時,會分配內存來創建第二個維度。 這驗證了我的上述語句 - 指針緩沖區的每個元素都必須指向一個緩沖區。

現在有了建議的代碼 -

 *p = (int **) malloc(a * sizeof(int *));

創建了一個數組,每個元素都指向緩沖區“子集”,它們共同創建了一個真正的2D數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM