接下来说的这个问题,自己碰到过好多次了,每次都找不到答案,结果不了了之,这次花了一个下午的时间在论坛上问,如果不记录下来,实在对不起我自己了:
想做的就是读取制定目录下的文件,存在一个二维数组中(文件个数为二维数组的行数,文件名可以为存为二维数组每一行里面),先试试了二维数组的创建就错误百出,我先给出正确的代码吧:
#include <stdio.h>
#include <malloc,h>
void build_2d_array(int file_count , int dict_size , char ***vector);
void print_array(int file_count , int dict_size , char**vector);
int main()
{
int file_count = 5 ;
int dict_size = 20 ;
char ** vector ;
build_2d_array(file_count , dict_size , &vector);
print_array(file_count , dict_size , vector);
}
void build_2d_array(int file_count , int dict_size , char ***vector)
{
int i , j ;
*vector = (char**)malloc(file_count*sizeof(char*));
if(!(*vector)){
printf("Locate memory error !");
}
for(i = 0 ; i<file_count ; i++)
*(*vector+i) = (char*)malloc(dict_size*sizeof(char));
for(i=0 ; i<file_count ; i++)
for(j = 0 ; j<dict_size ; j++)
*(*(*vector+i)+j) = 's';
}
void print_array(int file_count , int dict_size , char **vector)
{
int i , j ;
for(i= 0 ; i<file_count ; i++)
for(j=0 ; j<dict_size ; j++)
printf("The elements are : %c", *(*(vector+i)+j));
for(i = 0 ; i< file_count ; i++)
free(*(vector+i));
free(vector);
}
注:我自己写的时候写为下面这种形式了:(出错的地方在上面标红的地方)
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) = 's' ;
}
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);
}
总之,原因还是传参的问题,如果不用 &vector , vector这个值是改变不了的,我写的编译没有错误,但是运行时出现:
0xC0000005: 读取位置 0x00000000 时发生访问冲突 , 这是由于vector此时仍未NULL,根本没有通过build_2d_array()改变了。
而且还要注意在build_2d_array(int file_count , int dict_size , char ***vector) ; 中对vector的引用都要变为: *vector 。
切记 , 切记 , 下次不能再出现这种错误!!