归并排序合并两个数组时,警告我缓冲区溢出,这是什么原因?

m:mid
l:letf
r:right

void merge(int* a, int m, int l, int r)//合并
{
int* ma;
ma= (int*)malloc((r - l + 1) * sizeof(int));//实行合并的辅助数组
int p1 = l;
int p2 = m + 1;
int i = 0;
while (p1 <= m && p2 <= r)//取小值
{
if (a[p1] <= a[p2])
ma[i++] = a[p1++];
else ma[i++] = a[p2++];
}
while (p1 <= m)//取左侧未取完的值
{
ma[i++] = a[p1++];
}
while (p2 <= m)//取右侧未取完的值
{
ma[i++] = a[p2++];
}
for (i = 0; i <r-l+1; i++)//拷贝到原数组
{
a[l + i] = ma[i];
}
free(ma);
}

运行结果及报错内容

警告 C6386 写入到“ma”时缓冲区溢出: 可写大小为“((r-l+1))*sizeof(int)”个字节,但可能写入了“8”个字节。
警告 C6011 取消对 NULL 指针“ma”的引用。

是我对malloc用法理解错误了吗

打印malloc申请的大小,看是否正确