-1

私は数字の配列を持っています..必要なもの:mallocによって2つの新しい配列を作成するには、1つは偶数用、もう1つは奇数用であり、各配列のサイズでもメインで印刷する必要があります

配列は 1,2,5,6,8,4,5,10,65,69,98,76,46,49,67 です

偶数配列: 2,6,8,4,10,98,76,46

奇数配列: 1,5,5,65,69,49,67

関数はこのように書かなければなりません (これは教師が望んでいる方法です)

void evenodd(int a[],int** even,int* evensize,int** odd,int* oddsize)

私のコード:

#include <stdio.h>
#include <stdlib.h>
#define N 15
void evenodd(int a[],int** even,int* evensize,int** odd,int* oddsize)
{
    int i,j,cnte,cnto,e,o;
    cnte=cnto=0;
    for(i=0;i<N;i++)
    if(a[i]%2==0) cnte++;
    else cnto++;

    even=(int**)malloc(sizeof(int)*cnte);
    *evensize=cnte;
    odd=(int**)malloc(sizeof(int)*cnto);
    *oddsize=cnto;

    for(i=0,o=0,e=0;i<N;i++)
        if(a[i]%2==0)
        even[e++]=a[i];
        else odd[o++]=a[i];
  return;
}

int main()
{
    int i;
    int a[N]={1,2,5,6,8,4,5,10,65,69,98,76,46,49,67};
int *even,evensize,*odd,oddsize;
evenodd(a,&even,&evensize,&odd,&oddsize);
printf("Even Numbers Array: ");
for(i=0;i<evensize;i++)
printf("%d ",even[i]);
printf("\nSize of even array is: %d",evensize);
    printf("\n\n");
printf("Even Numbers Array: ");
for(i=0;i<oddsize;i++)
    printf("%d ",odd[i]);
printf("\nSize of even array is: %d",oddsize);
}

エラーはMallocにあると思います..しかし、理由はわかりません..

4

3 に答える 3

4

割り当てを次のように更新します

*even = malloc(sizeof(int)*cnte);
*odd = malloc(sizeof(int)*cnto);

として使用します

for(i=0,o=0,e=0;i<N;i++)
    if(a[i]%2==0)
      (*even)[e++]=a[i];
    else 
      (*odd)[o++]=a[i];
于 2013-07-20T18:24:43.873 に答える
3

あなたのmalloc電話は:

even=(int**)malloc(sizeof(int)*cnte);
...
odd=(int**)malloc(sizeof(int)*cnto);

これが間違っているという最初の手がかりは、関数への出力パラメーターevenoddあるはずですが、ここではローカル変数を変更しています。C は引数を値で渡します。呼び出し元から渡されたオブジェクトを変更するには、レベルの間接化 (ポインター) を追加する必要があります。(これについての説明は、 C Programming: malloc() inside another functionに対する私の回答を参照してください。)evenodd

したがって、malloc呼び出しは次のようになります。

*even=malloc(sizeof(int)*cnte);
...
*odd=malloc(sizeof(int)*cnto);

C では、 の結果を明示的にキャストする必要がないことに注意してくださいmalloc(そうすることで、エラーを隠すことができます)。のタイプが変更された場合に、誤ったバッファ サイズをサイレントに割り当てないように、p = malloc(sizeof *p)代わりにを使用することも一般的に推奨されます。p = malloc(sizeof (type))p

*even=malloc(sizeof **even * cnte);
...
*odd=malloc(sizeof **odd * cnto);
于 2013-07-20T18:27:20.987 に答える
2

C 関数呼び出しは値渡しを使用するため、out パラメーターを介して値を返すには、返される値を保持する変数へのポインターが必要です。ただし、その関数内では、ポインターを逆参照して、変数に格納されている値を変更し、呼び出し元が値が返されたことを確認できるようにする必要があります。(カウンター関数のパラメーターについては、これを正しく取得しますevensizeoddsize)

例を挙げると、even配列は次のように割り当てられています。

    even=(int**)malloc(sizeof(int)*cnte);

タイプ の項目 (またはこの場合は項目の配列) を動的に割り当てると、FOOmalloc()論理的に を返しますFOO *の戻り値をキャストするべきではありません malloc()が、とにかくキャストが間違っています。次のようにする必要があります。

    even=(int*)malloc(sizeof(int)*cnte);

ただし、evenはの変数int **へのポインタです。結果を表示するには、関数に渡されたポインターを逆参照する必要があります。前述のように、 の結果をキャストしないでください。プロトタイプが欠落している場合にエラーがマスクされ、最悪の場合未定義の動作につながる可能性があるためです。int *evenmain()main()malloc()

    *even=malloc(sizeof(int)*cnte);

C では、変数の宣言は use を模倣します。つまり、. int **even_ したがって、値を適切に割り当てるには、 2 回逆参照する必要があります。によって割り当てられた配列に到達するのは 1 回目で、目的のインデックス位置に到達するのは 2 回目です。したがって、あなたの割り当てステートメント:**evenintintevenmalloc()

        even[e++]=a[i];

一度だけ逆参照されるため、型にint値を割り当てているため、間違っています。は へのポインタであるため、次を使用します。int *evenevenint *

        (*even)[e++] = a[i];

odd同様に、関数パラメーターについても同じ修正を行います。

于 2013-07-20T18:22:46.187 に答える