C语言的动态内存分配有关问题

C语言的动态内存分配问题

# include <stdio.h>
# include <malloc.h>
# include <iostream>

using namespace std;
int main()
{
int ** p;  //定义一个多级指针
int i, j;

    p=(int **)malloc(sizeof(int*)*3); //动态分配n个指针


for (i = 0; i < 3; i++)
p[i]=(int *)malloc(sizeof(int));  //让每个指针指向一快内存


for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
p[i][j] = 10+i+j;
}
}

for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
cout << p[i][j] << "   ";
}
cout << endl;
}

for (i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
free((*(p+i)+j));


free(p);

return 0;
}


上面运行老是出错,问题就在我释放内存的问题上,但不知道怎么改
C

------解决方案--------------------
for (i = 0; i < 3; i++)
        p[i]=(int *)malloc(sizeof(int));  //让每个指针指向一快内存
这个不是应该这样写啊
for (i = 0; i < 3; i++)
        p[i]=(int *)malloc(sizeof(int)*3);  //让每个指针指向一快内存