C语言二维数组的分配(记录我的指针引用错误)

本文记录了在C语言中尝试动态分配二维数组时遇到的指针引用错误。作者通过示例代码说明了如何正确创建二维数组,并强调了传参时需使用&vector以及在函数内部使用*vector的重要性,以避免运行时出现访问冲突的错误。
摘要由CSDN通过智能技术生成

接下来说的这个问题,自己碰到过好多次了,每次都找不到答案,结果不了了之,这次花了一个下午的时间在论坛上问,如果不记录下来,实在对不起我自己了:

想做的就是读取制定目录下的文件,存在一个二维数组中(文件个数为二维数组的行数,文件名可以为存为二维数组每一行里面),先试试了二维数组的创建就错误百出,我先给出正确的代码吧:

#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 。

切记 , 切记 , 下次不能再出现这种错误!!


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值