二级指针的三种内存模型的整理与分析

来源:互联网 发布:淘宝中学科学实验室 编辑:程序博客网 时间:2024/06/06 07:12

              指针:指向一定内存空间,其值得大小等于该空间的地址的一类特殊的变量,系统会为这个指针在临时区开辟固定大小的内存。

二级指针可以看成是存放一级指针变量的地址的变量,二级指针有三种内存模型,以字符型二级指针为例,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;
}


0 0
原创粉丝点击