c语言二级指针申请空间问题

char **data;
*data = malloc (100);
为什么段错误
应该怎么申请

申请 101次.100个指针空间,数据空间,每次申请100~199字节内存。
char **data=(char **)malloc(sizeof(char *)*100);

for(int i=0;i<100;i++)
{
data[i] =(char*)malloc(sizeof(char)*(100+rand()%100);
}
.....................
for(int i=0;i<100;i++)
free(data[i]);
free(data);**

data没有初始化:

char **data, *p;
*data=p;
 p = (char*)malloc (100*sizeof(char));

这样:

 data没有初始化:

char **data, *p;
data=&p;
 p = (char*)malloc (100*sizeof(char));

http://ask.csdn.net/questions/226143

 *data = malloc (sizeof(char *) * 100);
for (int i = 0; i < 100; i++)
{
    data[i] = malloc(sizeif(char));
}

char **data;
data = (char **) malloc(sizeof(char ));
for (i=0; i<100; i++)
{
data[i] = (char
) malloc(100 * sizeof(char));
}

**只申请两次。共1M左右内存
char **data=malloc(sizeof(char *)*100);
data[0] =malloc(1000000*sizeof(char));

for(int i=1;i<100;i++)
{
data[i] =data[i-1]+10000;
}
.....................
free(data[0]);
free(data);**