编写C语言遇到的一些问题3

1.读取XXXX位置时发生访问冲突的问题

出现这个问题一般有两个原因,一是使用的内存没有初始化,二是索引超过范围了。对于索引超过范围的问题可通过printf索引查找原因。

2.二维数组内存分配空间及释放空间问题

方式一:

分配:

int **dp1;
dp1 = (int **)malloc(sizeof(int *) * row);//分配指针数组,计算行的大小
for(int i=0; i<row; i++)
{
   dp1[i] = (int *)malloc(sizeof(int) * (column));//分配每个指针所指向的数组,再计算列
}

释放:

for(int i=0;i<row;i++)
{
    free(dp1[i]);
}
free(dp1);

方式二:

 int*ptr[row];
 
 for(int i=0;i<row;i++)
  {
      ptr[i]=(int*)malloc(sizeof(int)*column);
  }

方式三:

自动分配内存

int a[row][column]

不用专门释放

参考:https://blog.csdn.net/tingfenghanlei/article/details/85066486

3.fwrite和fprintf的区别

fprintf是将数据以字符的形式写入,fwrite是将数据本身写入。

3.1

由于fprintf写入时,对于整数来说,一位占一个字节,比如1,占1个字节;10,占2个字节;100,占3个字节,10000,占5个字节,所以文件的大小会随数据的大小而改变,对大数据空间占用很大。
而fwrite是按二进制写入,所以写入数据所占空间是根据数据类型来确定,比如int的大小为4个字节(一般32位下),那么整数10所占空间为4个字节,100、10000所占空间也是4个字节。所以二进制写入比格式化写入更省空间。


3.2

由于fprintf以文本形式保存文件,所以当保存多组数据的时候,每组数据之间必须有分隔符,可以是空格,换行符或者特殊字符,否则在读取文件的时候会出错。

参考:https://blog.csdn.net/godenlove007/article/details/7721647

https://blog.csdn.net/geng823/article/details/41015283

4.二维数组初始化问题

如果采用2中第一种方式为分配内存空间,分配的空间可能是不连续的,不能采用一个memset初始化,可采用如下方式,在分配空间的时候直接初始化:

for (i = 0;i < row; i++)
{
	m[i] = (int*)malloc(col * sizeof(int));
	memset(m[i],0,col * sizeof(int));//每次malloc后就初始化,绝对没问题
}

4.1memeset函数只能对连续的内存空间初始化。两次用malloc函数在堆上分的内存可能会不连续,因此错误。

4.2如果是直接声明的多维数组如a[5][5],其内存肯定是连续的,此时统一memset没问题。

参考:https://blog.csdn.net/lvhaitao/article/details/50849352

猜你喜欢

转载自blog.csdn.net/yanxiaopan/article/details/86285883