直接建立陣列與malloc申請記憶體建立陣列
阿新 • • 發佈:2021-01-30
技術標籤:演算法小白記錄
有關直接建立陣列與通過malloc二級指標建立陣列的區別
如果是直接建立的,那麼函式引用時形式為matrix[][col],
倘若是通過指標申請的,那麼函式可以直接引用(int** matrix)
至於為什麼,不太明瞭
首先理解:直接建立的陣列matrix[][]之所以需要col,是因為尋找matrix[i][j]是通過尋覓*(matrix+i*3+j)去確定資料的位置的,那麼作為
暈了
一個一維指標陣列與多個一維陣列共同構成二維陣列
先討論直接建立的,matrix[][]
如果在主函式引用matrix[i][j],沒有錯誤
直接引用matrix[i],會列印第i行的首地址
甚至* (*(matrix+i)+j)也能列印預期結果
1.正確呼叫
函式呼叫形式為f(int matrix[][col])
上述呼叫也都成立
2.錯誤呼叫
函式呼叫形式為f(int** matrix)
那麼結果顯示matrix+1是在matrix的基址上加8的位元組,而不是預期的sizeof(int)*col個位元組
因為此時matrix就只是原陣列地址的一個拷貝,原陣列的列數等資訊早已丟失,故此時已經不可能通過matrix去簡單獲得二維陣列的資訊了
但是
通過malloc去建立陣列
int** mPtrPtr = (int**)malloc(sizeof(int*)*3);
if(!mPtrPtr) return -1;//申請失敗
for(i = 0;i < 3;i++)
{
*(mPtrPtr+i) = (int*)malloc(sizeof(int)*3);
if(!(*(mPtrPtr+i))) exit(-1);//申請失敗
}
得到陣列mPtrPtr,簡寫為m
建立完直接呼叫肯定是沒有問題的,通過m[][]呼叫抑或*(*(m+i)+j)
/*警告*(m+i*col+j)是會出大問題的,不可以這麼呼叫,因為指標+i,是在基址上加i*sizeof(element),而m的element是一維陣列*/
淦,malloc建立的陣列使用f(int m[][col])呼叫列印會出錯
經驗證, 可以直接通過f(int** m)呼叫,函式裡面可以直接通過m[][]獲取陣列資訊
一個沒有把握的結論:
1.直接建立的陣列只能通過f(int m[][col])去函式呼叫
2.malloc建立的陣列只能通過f(int** m)去函式呼叫
#include<stdio.h>
#include<stdlib.h>
void p(int** m);
int main()
{
int i,j;
int num = 1;
int** mPtrPtr = (int**)malloc(sizeof(int*)*3);
if(!mPtrPtr) return -1;//申請失敗
for(i = 0;i < 3;i++)
{
*(mPtrPtr+i) = (int*)malloc(sizeof(int)*3);
if(!(*(mPtrPtr+i))) exit(-1);//申請失敗
}
/*賦值*/
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3;j++)
{
mPtrPtr[i][j] = (num++);
}
}
/*列印*/
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3;j++)
{
printf("%d ",mPtrPtr[i][j]);
}
printf("\n");
}
p(mPtrPtr);
printf("釋放已經申請的記憶體\n");
for(i = 0;i < 3;i++)
{
free(*(mPtrPtr+i));
*(mPtrPtr+i) = NULL;
}
free(mPtrPtr);
mPtrPtr = NULL;
/**上面的程式碼已經表明,關於二級指標建立的矩陣,直接引用進行列印是可以的
下面的程式碼將以直接建立的矩陣作為對比*/
int m[3][3];
num = 1;
/*賦值*/
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3;j++)
{
m[i][j] = (num++);
}
}
printf("建立矩陣直接列印如下\n");
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3;j++)
{
printf("%d ",m[i][j]);
}
printf("\n");
}
p(m);
return 0;
}
void p(int** m)
{
printf("函式p的列印結果\n");
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3;j++)
{
printf("%d ",m[i][j]);
}
printf("\n");
}
}