二级指针三种内存模型强化训练

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

/*功能:把myp1,myp2指向的数据拷贝到myp3,并且排序*/
int sort(char**myp1,int num1,char(*myp2)[30],int num2,char***myp3,int *num3)
{
    char** p3 =NULL;
    int i,j,tmplen,n;
    char*tmp;
    p3 = (char**)malloc((num1+num2)*sizeof(char*));
    if (p3 == NULL)
    {
        return -1;
    }
    for (i =0;i<num1;i++)
    {
        tmplen = strlen(myp1[i])+1;
        p3[i] = (char*)malloc(tmplen*sizeof(char));
        if (p3[i]==NULL)
        {
            return -2;
        }
        strcpy(p3[i],myp1[i]);
    }

    
    for (j = 0;j<num2;j++)
    {
        //printf("%d\n",i+j);
        tmplen = strlen(myp2[j])+1;
        p3[i+j] = (char*)malloc(tmplen*sizeof(char));
        strcpy(p3[i+j],myp2[j]);
        
    }

    //排序
    tmplen = num1+num2;
    
    for (i = 0;i< tmplen;i++)
    {
        for (j = i+1;j<tmplen;j++)
        {
            if (strcmp(p3[i],p3[j])>0)
            {
                tmp = p3[i];//交换指针 改变指针指向
                p3[i] = p3[j];
                p3[j] = tmp;
            }
        }
    }
    *myp3 = p3;//间接赋值是指针存在的最大意义 
    *num3 = tmplen;//间接赋值是指针存在的最大意义
    return 0;
}
void printResult(char**p,int len)
{
    int i;
    for (i=0;i<len;i++)
    {
        printf("%s\n",p[i]);
    }
}
//释放二级指针内存空间
void freeSource(char **p,int len)
{
    int i = 0;
    if (p==NULL)
    {
        return;
    }
    for ( i = 0;i<len;i++)
    {
        free(p[i]);
    }
    free(p);
}
//释放二级指针内存空间
void freeSource2(char ***p,int len)
{
    int i = 0;
    char **tmp = NULL;
    tmp = *p;

    if (tmp==NULL)
    {
        return;
    }
    for ( i = 0;i<len;i++)
    {
        free(tmp[i]);
    }
    free(tmp);
    *p = NULL;
}
int main()
{
    /*p1,buf2主调函数分配内存*/
    char*p1[]= {"bbbbbb","aaaaaaa","ccccccc"};
    char buf2[10][30]={"333333","111111","222222"};
    /*p3被调函数分配内存,通过函数参数返回*/
    char**p3 = NULL;
    int len1,len2,len3,ret = 0,i;

    len1 = sizeof(p1)/sizeof(*p1);
    //printf("len1:%d\n",len1);
    len2 = 3;
    //printf("sizeof(buf2):%d\n",sizeof(*buf2));

    ret = sort(p1,len1,buf2,len2,&p3,&len3);
    if (ret!=0)
    {
        printf("func sort() err:%d\n",ret);
    }
    //printf("hello\n");
    printResult(p3,len3);
    freeSource2(&p3,len3);

    system("pause");
    return;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在C语言中,我们可以使用二级指针(即指向指针的指针)来动态申请内存空间。在一个C类中,如果我们需要定义一个二级指针数组,可以按照以下方式进行操作: 首先,我们需要定义出一个指向指针的指针来,即“char **ptr”,它是一个二级指针类型,然后再进行二级指针数组的申请: char **ptr; //定义一个指向指针的指针 ptr = (char **)malloc(sizeof(char *)*n); //分配n个指向指针的指针的内存空间 for(int i=0; i<n; i++) { ptr[i] = (char *)malloc(sizeof(char)*m); //为每一个指针指向的内存分配m个字符的空间(即m字节) } 在上述代码中,我们首先通过malloc函数为二级指针数组中的每一个指针分配size_t大小的内存空间,而这样的指针数组就占据了sizeof(char *)n个字节的内存空间。之后我们再借助for循环,为每一个指针指向的内存分配了m个字符的空间(即m字节),并将字符指针赋值给ptr[i]。 最后,记得当不需要这些内存空间时,我们应该通过类似于free(ptr[i])的方式释放每一个指针所占用的内存,之后再free(ptr)释放整个指针数组占用的内存空间。 ### 回答2: 在C语言中,二级指针数组的内存申请通常用于动态分配二维数组的存储空间。在C语言中,动态分配内存需要使用malloc函数来分配内存空间,因此我们可以采取类似于下面的方法来申请二级指针数组的内存: ```c #include<stdio.h> #include<stdlib.h> int main() { int row, col, i, j; int **p; printf("Enter the number of rows: "); scanf("%d", &row); printf("Enter the number of columns: "); scanf("%d", &col); p = (int **)malloc(row * sizeof(int *)); // 分配一维指针数组的存储空间 for(i = 0; i < row; i++) { p[i] = (int *)malloc(col * sizeof(int)); // 分配二维数组每一行的存储空间 } for(i = 0; i < row; i++) { for(j = 0; j < col; j++) { printf("Enter p[%d][%d]: ", i, j); scanf("%d", &p[i][j]); } } printf("The array is:\n"); for(i = 0; i < row; i++) { for(j = 0; j < col; j++) { printf("%d\t", p[i][j]); } printf("\n"); } for(i = 0; i < row; i++) { free(p[i]); // 释放二维数组每一行的存储空间 } free(p); // 释放一维指针数组的存储空间 return 0; } ``` 在这个程序中,我们首先使用malloc函数分配一维指针数组p的存储空间,它的大小为row * sizeof(int *),其中int *表示指向int类型的指针。接下来,我们使用循环分别为二维数组的每一行分配存储空间。最后,我们使用循环来输入和输出二维数组的元素,并逐个释放每一行的存储空间和一维指针数组的存储空间。这样做可以避免浪费内存空间,并确保程序运行的稳定性。 需要注意的是,二级指针数组在申请内存、访问元素和释放内存等方面的操作与二维数组类似,只是需要更多的指针操作和语法熟练度。因此,在使用二级指针数组申请内存时,建议加强指针的基础知识和技巧练习,以确保程序的正确性和效率。 ### 回答3: 在C语言中,二级指针数组是一种非常常见的数据类型,它可以用来处理许多复杂的内存分配和动态数据结构操作。对于类中的二级指针数组来说,它的内存分配和使用也有一些特殊要求。 首先,对于二级指针数组的内存分配,我们可以使用malloc等函数来动态分配内存空间。在类中使用二级指针数组时,通常需要先定义一个二级指针数组变量,然后再使用malloc函数来分配其内存空间。例如: ``` class MyClass { public: int **p; // 二级指针数组 MyClass() { // 动态申请内存 p = (int **)malloc(sizeof(int *) * 10); for (int i = 0; i < 10; i++) { p[i] = (int *)malloc(sizeof(int) * 10); } } ~MyClass() { // 释放内存 for (int i = 0; i < 10; i++) { free(p[i]); } free(p); } }; ``` 在上面的代码中,我们使用了malloc函数动态申请内存,首先申请了一个大小为10的int*类型的数组,然后再循环分别为每个数组元素分配了一个大小为10的int类型子数组。这样,我们就成功地创建了一个大小为10*10的二级指针数组,并且在类析构函数中也释放了其申请的内存空间。 对于类中的二级指针数组,还有一些需要注意的地方。例如,在使用二级指针数组时,一定要记得先分配外层指针的内存空间,然后再为每个子数组分配内存空间。此外,由于二级指针数组的内存分配比较复杂,因此在进行内存分配时,一定要格外小心,以免出现内存泄漏等问题。 总之,类中的二级指针数组是一种很重要的数据类型,它可以用来处理许多高级的内存操作。因此,我们在使用二级指针数组时一定要细心、认真地进行内存分配和空间释放,以保证程序的正确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值