二級指針的三種內存模型的整理與分析

              指針:指向一定內存空間,其值得大小等於該空間的地址的一類特殊的變量,系統會爲這個指針在臨時區開闢固定大小的內存。

二級指針可以看成是存放一級指針變量的地址的變量,二級指針有三種內存模型,以字符型二級指針爲例,char *pointer[30]爲第一種內存模型,編譯器會自動將[]退化爲指針,其實質是char **pointer,其用法是char *pointer[30]={"hello","world","how","interesting"};’

char pointer[30][40]爲第二種內存模型的表示方法,其用法是char pointer[30][40]={“www”,"aaaa","dfdafd"};高級維數的大小必須限定,這樣系統纔可以知道指針移動一個單位所移動的內存的大小;char **pointer是第三種內存模型,這種內存空間是開發者自主開闢的空間,也需要開發者來釋放,開闢的內存空間在堆上。

            下面我講展現具體的代碼來整理二級指針的三種內存模型的關係和使用,此代碼實現的功能是將第一種和第二種內存空間裏面的數據拷貝到堆空間,即二級指針的第三種內存模型所指代的空間裏面,再將內容排序後輸出字符串的個數和排序後的第三種內存空間中的內容。

            思路:

            1)主函數建立三種內存空間模型

            2)主調函數分配內存

            3)被調函數使用主調函數分配的內存空間,對數據進行排序操作

            4)釋放內存


            具體代碼如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int getarray(char **p, int num1, char(*p2)[40], int num2, char ***p3, int *num3)
{
//首先判斷主調函數傳過來的內存是否爲空,爲空則不能操作
int ret = 0;
char **temp = NULL;
char *temparray = NULL;
int num = 0;
int i = 0;
int j = 0;
if (p == NULL || p2 == NULL || p3 == NULL || num3 == NULL)
{
ret = -1;
printf("func err p==NULL||p2==NULL||p3==NULL||num3==NULL,%d", ret);
return ret;
}
num = num1 + num2;
temp = (char **)malloc(num*sizeof(char *));
if (temp == NULL)
{
ret = -1;
return ret;
}
for (i = 0; i<num1; i++)
{
temp[i] = (char *)malloc(strlen(p[i]) + 1);
if (temp[i] == NULL)
{
printf("invalid");
}
strcpy(temp[i], p[i]);
}
for (j = 0; j<num2; j++, i++)
{
temp[i] = (char *)malloc(strlen(p2[j]) + 1);
if (temp[i] == NULL)
{
printf("invalid");
}
strcpy(temp[i], p2[j]);
}
for (i = 0; i<num; i++)
{
for (j = i + 1; j<num; j++)
{
if (strcmp(temp[i], temp[j])>0)
{
temparray = temp[i];
temp[i] = temp[j];
temp[j] = temparray;
}
}
}
*p3 = temp;

*num3 = num;
return ret;
}


//釋放內存
int getArray3_Free2(char ***p3, int p3num)
{
int i;
char **tmp = NULL;


if (p3 == NULL)
{
return -1;
}
tmp = *p3;


for (i = 0; i<p3num; i++)
{
if (tmp[i] != NULL)
{
free(tmp[i]);
}
}
free(tmp);


*p3 = NULL; //通過間接賦值,去間接的修改實參的值,成0
}


void main()
{
//建立三種內存模型
char *p1[] = { "hello", "world", "my", "god" };
char p2[30][40] = { "www", "sss", "dddfdf" };
char **p3 = NULL;
int rv;
int i, num = 0;
rv = getarray(p1,3, p2, 3, &p3, &num);
if (rv != 0)
{
printf("no valid outputs");
return rv;
}
for (i = 0; i < num; i++)
{
printf("%s\n", p3[i]);
}
getArray3_Free2(&p3, num);





system("pause");
//return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章