在才中递归使用同名指针分配内存是否有可能存在有关问题

在才中递归使用同名指针分配内存是否有可能存在问题
我写了一个插入排序和合并排序的小程序,,
然后,运行的时候,发觉每次都会出现
debug error
错误显示,DAMAGE:beforeNormalblock(#44)at 0x00380970
然后我忽略,就会排序,问题是,排序后的大部分都是真确的,有个别错误,,
我想问一下,是什么原因,,是不是我在递归使用同名指针分配内存,和释放内存导致的结果,
当我 把释放内存去掉后,确实会没有错误提示,虽然结果依然不正确,
我想问下,是不是不能在递归使用同名指针分配内存啊,
C/C++ code

#include<stdio.h>
#include<stdlib.h>
#define N 200

void Inser ( int num[], int size ) ;
void Merge ( int num[], int size ) ;

int main( void )
{
    int i = 0 ;
    int arr[N]={2,8,5,1,2,4,15,65,12,54,125,112,5,1,5558,224,2125,15521,241,2255,\
        2,8,5,1,2,4,15,65,12,54,125,112,5,1,5558,224,2125,15521,241,2255,\
        2,8,5,1,2,4,15,65,12,54,125,112,5,1,5558,224,2125,15521,241,2255,\
        2,8,5,1,2,4,15,65,12,54,125,112,5,1,5558,224,2125,15521,241,2255,\
        2,8,5,1,2,4,15,65,12,54,125,112,5,1,5558,224,2125,15521,241,2255,\
        2,8,5,1,2,4,15,65,12,54,125,112,5,1,5558,224,2125,15521,241,2255,\
        2,8,5,1,2,4,15,65,12,54,125,112,5,1,5558,224,2125,15521,241,2255,\
        2,8,5,1,2,4,15,65,12,54,125,112,5,1,5558,224,2125,15521,241,2255,\
        2,8,5,1,2,4,15,65,12,54,125,112,5,1,5558,224,2125,15521,241,2255,\
        2,8,5,1,2,4,15,65,12,54,125,112,5,1,5558,224,2125,15521,241,2255,\
    } ;

    Merge ( arr, sizeof(arr)/sizeof(int) ) ;
    for( ; i < N; i++)
    {
        printf("%d\n",arr[i]);
    }


}

//插入排序
void Inser ( int num[], int size )
{
    int x ;
    int i ;
    int key ;
    int l = size ;
    for(x = 1; x < l; x++)
    {
        key = num[x] ;
        i = x - 1 ;
        while ( i >= 0 && num[i] > key)
        {
            num[i+1] = num[i] ;
            i-- ;
        }
        num[i+1] = key ;
    }
} 
//合并排序
void Merge ( int num[], int size )
{
    int *p = (int *) malloc ( sizeof(int) * ( size/2) ) ;
    int *q = (int *) malloc ( sizeof(int) * (size-size/2) );
    int i;
    int x = size/2 - 1, y = size - size/2 - 1 ;
    int k = 0, z = 0, s = 0 ;

//分解
    if ( size >= 100 )
    {
        for(i = 0; i < size/2; i++)
        {
            p[i] = num[i] ;
        }
        Merge( p, size/2) ;
        for(    ; i < size; i++ )
        {
            q[i-size/2-1] = num[i] ;
        }
        Merge(q, size-size/2) ;
    }

//调用插入排序
    if ( size <= 100 )
    {
        Inser ( num, size ) ;
        return 0;
    }

//合并
    while( x != 0 || y != 0 )
    {

        if( 0 == x )
        {
            num[s] = q[z] ;
            s++ ;
            z++ ;
            y-- ;
            continue ;
        }
        else if ( 0 == y)
        {
            num[s] = q[k] ;
            s++ ;
            k++ ;
            x-- ;
            continue ;
        }
        if( p[k] < q[z] )
        {
            num[s] = p[k] ;
            k++ ;
            x-- ;
            s++ ;
        }
        else
        {
            num[s] = p[z] ;
            z++ ;
            y-- ;
            s++ ;
        }

    }


    free(p) ;
    free(q) ;


}



------解决方案--------------------
应该不会。感觉是循环变量控制错误。