0

2つの質問があります。1つはreallocに関するもので、もう1つはqsortを使用した並べ替えに関するものです。次のコードでは、「temp = realloc(input、(i + 1)* sizeof(int));」でクラッシュし続けますが、「i+2」ではすべて正常に動作します。なんで?:/整数 "<0"が入力されるまで、整数を配列に入れます。次に、いくつかのアドレスを印刷します。

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        int *input,*temp,*f,*l;
        input=malloc(sizeof(int));
        int x,i,counter;
        counter=0;
        i=0;
        while (x>=0)
        {
            scanf("%d",&x);
            if(x<0) break;
            input[i]=x;
            temp=realloc(input,(i+2)*sizeof(int));
            counter++;
            i++;
            if (temp!=NULL) input=temp;
            else
            {
                    free(input);
                    printf("Error allocating memory!\n");
                    return 1;
            }
        }
    for(i=0; i<counter; i++) printf("Input: %d",input[i]);
    printf("table address: %p",&input);
    printf("first element address: %p",&input[0]);
    printf("last element address: %p",&input[counter-1]);
    }

この配列をqsortでソートすることについて。私は「cplusplus.com」の例としてこのコードを見つけました:

    /* qsort example */
    #include <stdio.h>
    #include <stdlib.h>

    int values[] = { 40, 10, 100, 90, 20, 25 };

    int compare (const void * a, const void * b)
    {
        return ( *(int*)a - *(int*)b );
    }

    int main ()
    {
        int n;
        qsort (values, 6, sizeof(int), compare);
        for (n=0; n<6; n++)
        printf ("%d ",values[n]);
        return 0;
    }

ポインタaとbが例の配列にどのように接続されているのか理解できません。別の並べ替えアルゴリズムを使用する場合、または大きいものから小さいものに並べ替える場合は、「return((inta-(int)b);」を変更する必要がありますか?前もって感謝します!

4

1 に答える 1

1
  1. ここでは使用しないreallocでください。あなたはテーブルのサイズが何であるか知っています、それはxです。xしたがって、長さの最初のテーブルにを割り当てますmalloc。また、forここではループの方が適していますが、ではありませんwhile。ただの文体の改善。

  2. はい、その部分を変更します( *(int*)b - *(int*)a )。大きいものから小さいものに並べ替える必要があります。

于 2013-01-05T14:35:20.440 に答える