我的理解:
经过8楼的启发,我认为我的原程序的一个致命的地方是 p=(char **)malloc(num);指针是无符号整数,占4个字节,应该改为p=(char **)malloc(num*sizeof(int));
照原来的程序,当执行完后,p已超出了其之前malloc分配的范围,已指向一个未知的内存,会导致系统崩溃,我还认识到要想用free来释放之前malloc分配的内存,该指针必须指在该内存的首地址,通过很多次调试得出的结论。所以最后改为:
#include<stdio.h>
#include<stdlib.h>
void main()
{
char **p;
int num;
int i;
printf("input you number:");
scanf("%d",&num);
p=(char **)malloc(num*sizeof(int));
for(i=0;i<num;i++)
{
if((p[i]=(char*)malloc(20))==NULL)
{
printf("ERROR");
exit(0);
}
scanf("%s",p[i]);
}
for(i=0;i<num;i++)
{
printf("%s\n",p[i]);
free(p[i]);
}
free(p);
}