今天在编写Levenshtein distance距离函数时用到二维数组,用memset对其初始化时发生了问题,直接代码:
<span style="color:#333333;">int** m = NULL;
int i = 0,j = 0;
m = (int**)malloc(row * sizeof(int));
for (i = 0;i < row; i++)
{
m[i] = (int*)malloc(col * sizeof(int));
}
</span><span style="color:#ff6666;"><strong><u>memset(m,0,row*col*4);</u></strong></span><span style="color:#333333;">
for(i = 0; i < row; i++)
{
for(j = 0; j< col; j++)
{
m[i][j] = 0;
printf("%d ",m[i][j]);
}
printf("\n");
}</span>跟踪调试后,红色加粗的是错误的地方,百度了一下,原因如下:
1.memeset函数只能对连续的内存空间初始化。两次用malloc函数在堆上分的内存可能会不连续,因此错误。
2.如果是直接声明的多维数组如a[5][5],其内存肯定是连续的,此时统一memset没问题。
具体修改如下:
for (i = 0;i < row; i++)
{
m[i] = (int*)malloc(col * sizeof(int));
memset(m[i],0,col * sizeof(int));//每次malloc后就初始化,绝对没问题
}

在使用memset初始化二维数组时遇到问题,由于通过两次malloc分配的内存可能不连续,导致memset失败。解决方案是对每行malloc后的内存单独进行memset初始化。

1718

被折叠的 条评论
为什么被折叠?



