c语言——五个字符串大小比较和排序(求大佬帮我看看哪里错了)

#include<stdio.h>
#include<string.h>
void sort(char **p)
{
    int i,j,k;
    char *t=NULL;
    for(i=0;i<4;i++)
    {
        k=i;
        for(j=i+1;j<5;j++)
        {
            if(strcmp(p[k],p[j])>0)    
            {
                k=j;
            }
        }
        if(k!=i)
        {
            t=p[k];
            p[k]=p[j];
            p[j]=t;
        }
    }
}
int main()
{
    char str[5][20],*pstr[5],**p;
    int i;
    printf("请输入五个字符串:\n");
    for(i=0;i<5;i++)
    {
        //gets(str[i]);
        scanf("%s",str[i]);        
        pstr[i]=str[i];            //pstr[i]存的是每个字符串首元素的地址 
    }                            //而*(p+i)存的是 pstr[i]的值,也就是字符串首元素的地址        即:printf("%s",pstr[i])<==>printf("%s",*(p+i)) 
    printf("即:\n");            
    for(i=0;i<5;i++)
    {
        printf("%s\n",pstr[i]);
    }
    p=pstr;
    sort(p);
    printf("由小到大为:\n"); 
    for(i=0;i<5;i++)
    {
        printf("%s\n",pstr[i]);
    }

图一,能正确执行

图二:执行到一半光标就卡住了~~

 

```void sort(char **p)
{
    int i,j,k;
    char *t=NULL;
    for(i=0;i<4;i++)
    {
        k=i;
        for(j=i+1;j<5;j++)
        {
            if(strcmp(p[k],p[j])>0)    
            {
                k=j;
            }
        }
        if(k!=i)
        {
            t=p[k];
            p[k]=p[j];     //循环执行完之后,j变量必为 5 ,p[j]读越界,导致异常退出.这里的你的本意应该是与i交换
            p[j]=t;
        }
    }
}

```

void sort(char **p)
{
    int i,j,k;
    char *t=NULL;
    for(i=0;i<4;i++)
    {
        k=i;
        for(j=i+1;j<5;j++)
        {
            if(strcmp(p[k],p[j])>0)    
            {
                k=j;
            }
        }
        if(k!=i)
        {
            t=p[i];
            p[i] = p[k];
            p[k] = t;
        }
    }
}