[英]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.