在不大幅修改基础上, 修改如下代码中所有错误.
#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);
}