输入任意个英文字符串,按字符串长度由大到小顺序输出,结果字符串全都和原来输入的不一样

#include
#include
#include
int main()
{
int i,k,answer=0,count=0;
printf("请输入谚语:");
char array=(char)malloc(20*sizeof(char));
char temp[50];
char p=temp;
if(!array)
printf("分配内存失败!");
for(i=0;i<20;i++)
{array[i]=(char
)malloc(50*sizeof(char));
if(!array[i])
printf("分配内存失败!");}
i=0;
do{gets(*array+i);
i=i+1;
count++;
printf("继续输入(0),不再输入(1)");
scanf("%d",&answer);
getchar();

}while(answer==0);
for(i=0;i<count-1;i++)
for(k=0;k<count-1-i;k++)
if(sizeof(array[k])>sizeof(array[k+1]))
{*p=**(array+k);
**(array+k)=**(array+k+1);
**(array+k+1)=*p;

}
for(i=0;i<count;i++)
printf("%s\n",*array+i);
free(array);
return 0;

}

char array=(char)malloc(20*sizeof(char));
你这个arry是一个字符,一个字节,后面(char)malloc(20*sizeof(char));是把一个指针八个或者四个字节转换成一个字节的char用一个字节去保存,能不出错就怪了

malloc返回值是个指针,失败是空指针,根据机器不一样是4位或者8位,array[i]=(char)malloc(50*sizeof(char));,你后面这个i加一个加的也是一个字节,指针加1应该是加4的

运行一下这个试试,你的二维数组好像有点问题吧
//c语言
#include
#include
int main()
{
int i, k, answer = 0, count = 0;
printf("请输入谚语:");
char** array = (char**)malloc(20 * sizeof(char*));
char temp[50];
char* p = temp;
if (!array)
printf("分配内存失败!");
for (i = 0; i < 20; i++)
{
array[i] = (char*)malloc(50 * sizeof(char));
if (!array[i])
printf("分配内存失败!");
}
i = 0;
do{
gets(*array + i);
i = i + 1;
count++;
printf("继续输入(0),不再输入(1)");
scanf("%d", &answer);
getchar();
} while (answer == 0);

for (i = 0; i < count - 1; i++)
    for (k = 0; k<count - 1 - i; k++)
        if (sizeof(array[k])>sizeof(array[k + 1]))
        {
            *p = **(array + k);
            **(array + k) = **(array + k + 1);
            **(array + k + 1) = *p;

        }
for (i = 0; i < count; i++)
    printf("%s\n", *array + i);

for (int k = 0; k < 20;k++)
{
    free(array[k]);
}
free(array);
getchar();
return 0;

}