1. 程式人生 > >c語言二級指針內存模型

c語言二級指針內存模型

分配內存 空間 print -c 釋放 ret != oid 錯誤

第一種: 指針數組作為輸入參數

char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};//指針數組,數組中的每個元素都是指針,
int num = 4;

 

void printMyArray11(char **myArray, int num)
{
	int i = 0;
	for (i=0; i<num; i++)
	{
		//printf("%s \n", myArray[i]);
		printf("%s \n", *(myArray+i) );
	}
}

  正確地調用方法:

printMyArray11(myArray, num);

  

  

 

第二種 : 二級指針作輸入---內存模型(分配內存塊已知的情況)

char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};
int num =4;

作為如下函數的實參,不能實現功能,

//錯誤調用方法:
void printMyArray02_err(char **myArray, int num) { int i = 0; for (i=0; i<num; i++) { //printf("%s \n", myArray[i]); printf("%s \n", *(myArray+i) ); // } }
正確調用方法:
void printMyArray02(char myArray[10][30], int num)
{
	int i = 0;
	for (i=0; i<num; i++)
	{
		//printf("%s \n", myArray[i]);
		printf("%s \n", *(myArray+i) );  //
	}
}

 理由:指針步長不一樣,指針所指向的內存空間的數據類型不一樣。

 

  第三種內存模型:通過堆進行分配內存

//在主函數中進行變量的定義(如下)
char ** p2 =NULL;	

//定義子函數
char **GetMem(int num)
{
	int i = 0;
	char **p2 = NULL;
	p2 = (char **)malloc(sizeof(char *) * num);
	if (p2 == NULL)
	{
		return NULL;
	}

	for (i=0; i<num; i++)
	{
		p2[i] = (char *)malloc(sizeof(char)  * 100  ); //char buf[100];
		sprintf(p2[i], "%d%d%d", i+1, i+1, i+1);
	}
	return p2;
}

//主函數中調用
p2 = GetMem(num);

//操作完之後一定要調用如下的釋放內存函數進行釋放
void GetMemFree(char **p2, int num)
{
	int i = 0;
	//釋放內存
	for(i=0; i<num; i++)
	{
		if (p2[i] != NULL)
		{
			free(p2[i]);
			p2[i] = NULL;
		}
	}
	if (p2!=NULL) 
	{
		free(p2);
	}
}

  

c語言二級指針內存模型