通过函数参数形式申请二级指针空间, 代码改错

在不大幅修改基础上, 修改如下代码中所有错误.


#include <stdio.h>
#include <malloc.h>
 
void build_2d_array(int file_count , int dict_size , char **array) ;
void print_array(int m , int n , char**p);
int main(){
    int a= 5 ;
    int b = 20 ;
    char **vector=NULL;
    build_2d_array(a,b,vector) ;
    print_array(a,b,vector) ;
    return 0 ;
}
 
void build_2d_array(int file_count , int dict_size , char **array)
{
    int i,j ;
    array = (char**)malloc(file_count*sizeof(char*)) ;
    for(i=0 ; i< file_count ; i++)
        *(array+i) = (char*)malloc(dict_size*sizeof(char)) ;
    for (i=0;i<file_count;i++)
        for(j=0 ; j<dict_size ; j++)
            *(*(array+i)+j) = '1' ;
 
 
}
 
void print_array(int m , int n , char **p)
{
     int i,j;
     for(i=0 ; i< m ; i++)
         for(j=0 ; j< n; j++)
             printf("element are:\n",*(*(p+i)+j));
 
     for(i=0 ; i<m ; i++)
        free(*(p+i)) ;
     free(p);
}



此代码意图是用函数方法,动态申请二级指针的空间,并赋值, 然后打印所有值, 最后释放空间.

主要知识点有2个, 一是用函数形式申请空间,并通过函数的参数传递到调用函数中, 二是, 二维数组下标移动方法.


如下是改正后正确的代码.


#include <stdio.h>
#include <malloc.h>
 
//void build_2d_array(int file_count , int dict_size , char **array) ;
//修改为
void build_2d_array(int file_count , int dict_size , char ***array) ;
void print_array(int m , int n , char**p);
int main()
{
    int a= 5 ;
    int b = 20 ;
    char **vector=NULL;
    //build_2d_array(a,b,vector) ;  
    //修改为
    build_2d_array(a,b,&vector);
    print_array(a,b,vector) ;
    return 0 ;
}
 
//void build_2d_array(int file_count , int dict_size , char **array)
//修改为
void build_2d_array(int file_count , int dict_size , char ***array)
{
    int i,j ;
    //array = (char**)malloc(file_count*sizeof(char*)) ;//注意这里的array是个拷贝值,这样赋值的话,不会改变调用者传入的指针值
    *array = (char**)malloc(file_count*sizeof(char*)); //修改为
    for(i=0 ; i< file_count ; i++)
        //*(array+i) = (char*)malloc(dict_size*sizeof(char)) ;
        //修改为
        *(*array+i) = (char*)malloc(dict_size*sizeof(char));
    for (i=0;i<file_count;i++)
        for(j=0 ; j<dict_size ; j++)
            //*(*(array+i)+j) = 'a' ;    
            //修改为
            *(*(*array+i)+j) = 'a' ;
}
 
void print_array(int m , int n , char **p)
{
    int i,j;
    for(i=0 ; i< m ; i++)
        for(j=0 ; j< n; j++)
            printf("element are: %c \n", *(*(p+i)+j));
 
    for(i=0 ; i<m ; i++)
        free(*(p+i)) ;
    free(p);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值