[英]Dynamic Memory allocation for 2D Arrays in C Language
我試圖解決C的問題,本文給出了https://leetcode.com/problems/pascals-triangle/description/
這是我解決問題的方法。 我認為解決方案沒有問題,但是為2D array
動態分配內存變得非常復雜。 有人可以幫我弄清楚如何正確地動態分配內存到2D array
。 根據BLUEPIXY建議更新了代碼,我似乎仍然遇到運行時錯誤。
/**
* Return an array of arrays.
* The sizes of the arrays are returned as *columnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generate(int numRows, int** columnSizes) {
int i=0,j=0,numColumns =2;
columnSizes = (int **)malloc(numRows * sizeof(int *));
for (i=0; i<numRows; i++)
columnSizes[i] = (int *)malloc( sizeof(int));
int **returnArray = (int **)malloc(numRows * sizeof(int *));
for (i=0; i<numRows; i++)
returnArray[i] = (int *)malloc((i+1) * sizeof(int));
returnArray[0][0] = 1;
*columnSizes =1;
for(i=1;i<numRows;i++)
{
for(j=0;j<numColumns;j++)
{
if(j==0 )
columnSizes[i][j] = returnArray[i-1][j];
else if(j==(numColumns-1))
columnSizes[i][j] = returnArray[i-1][j-1];
else
returnArray[i][j] = returnArray[i-1][j-1] + returnArray[i-1][j];
numColumns++;
}
*(columnSizes+i) = numColumns-1;
}
return returnArray;
}
做這個
int *arr = (int *)malloc(r * c * sizeof(int));
並訪問這樣的元素
int i, j, count = 0;
for (i = 0; i < r; i++)
for (j = 0; j < c; j++)
*(arr + i*c + j) = ++count;
要么
如果您有指向該指針的指針,那么您將從此代碼中獲得一些幫助
int main()
{
int i,j;
int **p;
(p)=(int**)malloc(5*sizeof(int*));
for(i=0;i<5;i++)
*(p+i)=(int*)malloc(4*sizeof(int));
for(i=0;i<5;i++)
for(j=0;j<4;j++)
p[i][j]=2;
for(i=0;i<5;i++)
for(j=0;j<4;j++)
printf("%d",p[i][j]);
}
如果您在編程工作中要做的就是打印出結果,那為什么還要打擾任何存儲呢? 只需在此處使用解決方案。
關於多維數組和C,不存在此類支持。 因此,您必須使用一個或多個一維存儲塊和一些技巧來建立該索引,以建立自己的存儲空間。
@ tanuj-yadav建議的最簡單的方法對於大多數二維數組都可以正常工作,只是分配一個nXm長度的存儲塊,並執行非常簡單的索引算術arr [i * c + j]。
另一種常見的方法是數組的數組(又稱破爛數組)。 這就像一個列表列表,並且在每一行(或每一列)上都使用malloc天真地完成了操作。
新版本的問題
(1)
columnSizes = (int **)malloc(numRows * sizeof(int *));
for (i=0; i<numRows; i++)
columnSizes[i] = (int *)malloc( sizeof(int));
應該
*columnSizes = malloc(numRows * sizeof(int));
(※不必從C中的void *
強制轉換)。
(2)
*columnSizes =1;//type of `*columnSizes` is `int *`
應該
**columnSizes = 1;//meant columnSizes[0] = 1; at caller side (main)
(3)
columnSizes[i][j] = returnArray[i-1][j];
...
columnSizes[i][j] = returnArray[i-1][j-1];
應該
returnArray[i][j] = returnArray[i-1][j];
...
returnArray[i][j] = returnArray[i-1][j-1];
因為這是錯字。
(4)
numColumns++;
移至for(j=0;j<numColumns;j++){ }
(5)
*(columnSizes+i) = numColumns-1;
應該
*(*columnSizes+i) = numColumns-1;//For reasons similar to (2)
整個修復代碼:
int** generate(int numRows, int** columnSizes) {
int i=0,j=0,numColumns =2;
*columnSizes = malloc(numRows * sizeof(int));
int **returnArray = (int **)malloc(numRows * sizeof(int *));
for (i=0; i<numRows; i++)
returnArray[i] = (int *)malloc((i+1) * sizeof(int));
returnArray[0][0] = 1;
**columnSizes = 1;
for(i=1;i<numRows;i++)
{
for(j=0;j<numColumns;j++)
{
if(j==0 )
returnArray[i][j] = returnArray[i-1][j];
else if(j==(numColumns-1))
returnArray[i][j] = returnArray[i-1][j-1];
else
returnArray[i][j] = returnArray[i-1][j-1] + returnArray[i-1][j];
}
numColumns++;
*(*columnSizes+i) = numColumns-1;
}
return returnArray;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.