1. 程式人生 > 其它 >直接建立陣列與malloc申請記憶體建立陣列

直接建立陣列與malloc申請記憶體建立陣列

技術標籤:演算法小白記錄

有關直接建立陣列與通過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");
	}
}