>pt=(char**)calloc(num,sizeof(char));
pt = (char**)calooc(num, sizeof(char*));

>for(i=0;i<num;i++){
> free(p[i]); //pt[i]が指す領域を開放
> free(p); //pが指す領域を開放
> }
for(i=0;i<num;i++){
free(p[i]); //pt[i]が指す領域を開放
}
free(p); //pが指す領域を開放
いろいろおかしいけど、とりあえず致命的なとこだけ