最后始终是 if语句报错,如何解决?


#include <stdlib.h>
int main()
{
    int n;
    scanf("%d", &n);
    int* p = (int*)malloc(n * sizeof(int));

    if (p == NULL)
    {
        printf("%s", strerror(errno));
    }
    int* p1 = p;     
                                            //p1
    int i;                                         //p
    for (i = 0; i < n; i++)                        //_________________________________
    {
        scanf("%d", &(*(p+i)));
    }
    for (i = 0; i < n; i++)
    {
        printf("%d ", *(p + i));
    }
    printf("\n");
    ///////////////////////////////////////
    for (i = 0; i < n - 1 ; i++)
    {
        for (p=p1; p < p + n - 1; p++)
        {
            if (*p > *(p + 1))
            {
                int t;
                t = *p; *p = *(p + 1); *(p + 1) = t;
            }
        }
        //p = p - (n - 1);
    }
    for (i = 0; i < n; i++)
    {
        printf("%d ", *(p + i));
    }
    free(p);
    p = NULL;
    return 0;
}

最后始终是 if语句报错,不知道问题出现在哪里

修改如下,改动处见注释,原代码没什么大问题, for (p=p1; p < p + n - 1; p++) 这句死循环了,供参考:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n;
    scanf("%d", &n);
    int* p = (int*)malloc(n * sizeof(int));

    if (p == NULL)
    {
        printf("%s", strerror(errno));
    }
    int* p1 = p; //p1 指向数组首地址     修改
                 //p1
    int i;       //p
    for (i = 0; i < n; i++) //_________________________________
    {
        scanf("%d", &(*(p+i)));
    }
    for (i = 0; i < n; i++)
    {
        printf("%d ", *(p + i));
    }
    printf("\n");
    ///////////////////////////////////////
    for (i = 0; i < n - 1 ; i++)
    {                                    // 修改
        for (p=p1; p < p1 + n - 1; p++)  //for (p=p1; p < p + n - 1; p++)  p < p + n - 1 死循环了
        {                                //此时 p1 为数组的首地址 ,循环条件应改为:p < p1 + n - 1
            if (*p > *(p + 1))
            {
                int t;
                t = *p; *p = *(p + 1); *(p + 1) = t;
            }
        }
        //p = p - (n - 1);
    }
    for (i = 0; i < n; i++)
    {                              // 修改
        printf("%d ", *(p1 + i));  // printf("%d ", *(p + i));  p1 为数组首地址
    }
    free(p);
    p = NULL;
    return 0;
}

为什么要用这么多for语句做

运行报错,还是编译报错了?

报错,报什么错呢,把错误信息放出来呀

你把原来数组的指针 p 拿来循环,肯定报错,指定越界,改个名儿就行了:

for (i = 0; i < n - 1; i++)
{
    for (int *ptr = p1; ptr < p + n - 1; ptr++)
    {
        if (*ptr > *(ptr + 1))
        {
            int t = *ptr;
            *ptr = *(ptr + 1);
            *(ptr + 1) = t;
        }
    }
    //p = p - (n - 1);
}

由于指针p1和p指向的是一个地址,因此p++对应p1也++了。
代码修改如下所示:

#include <stdlib.h>
int main()
{
    int n;
    scanf("%d", &n);
    int* p = (int*)malloc(n * sizeof(int));
 
    if (p == NULL)
    {
        printf("%s", strerror(errno));
    }
    int* p1 = p;     
                                            //p1
    int i,j;                                         //p
    for (i = 0; i < n; i++)                        //_________________________________
    {
        scanf("%d", &(*(p+i)));
    }
    for (i = 0; i < n; i++)
    {
        printf("%d ", *(p + i));
    }
    printf("\n");
    ///////////////////////////////////////
    for (i = 0; i < n - 1 ; i++)
    {
        for (j=i+1; j <= n - 1; j++)
        {
            if (*(p+i) > *(p + j))
            {
                int t;
                t = *(p+i); 
                *(p+i) = *(p + j); 
                *(p + j) = t;
            }
        }
        //p = p - (n - 1);
    }
    for (i = 0; i < n; i++)
    {
        printf("%d ", *(p + i));
    }
    free(p);
    p = NULL;
    return 0;
}