打印偶数/奇数的错误输出 - c

时间:2013-07-20 18:18:55

标签: c arrays pointers malloc

我有一系列数字.. 需要什么:通过malloc创建2个新数组 一个用于偶数,一个用于奇数 我们也需要用主要的每个数组的大小打印它们

数组为1,2,5,6,8,4,5,10,65,69,98,76,46,49,67

Even Array必须是: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 ..但我不知道为什么......

3 个答案:

答案 0 :(得分: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];

答案 1 :(得分:3)

您的malloc来电是:

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

您的第一个线索是错误的应该是evenodd 输出参数到您的evenodd函数,但在这里您要修改< em>局部变量。 C按值传递参数;为了修改调用者传递的对象,必须添加一个级别间接(指针)。 (有关此问题的解释,请参阅我对C Programming: malloc() inside another function的回答。)

因此malloc来电应为:

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

请注意,在C中,没有必要显式地转换malloc(和doing so can hide errors)的结果。通常还建议使用p = malloc(sizeof *p)而不是p = malloc(sizeof (type)),这样如果p的类型发生更改,则不会以静默方式分配不正确的缓冲区大小:

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

答案 2 :(得分:2)

由于C函数调用使用pass by值,要通过out参数传回一个值,您需要一个指向变量的指针,该变量将保存传回的值。但是,在该函数中,您需要取消引用指针以更改存储在变量中的值,以便调用者看到传回的值。 (您可以使用计数器函数参数evensizeoddsize

举一个例子,您的even数组的分配方式如下:

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

当您动态分配类型为FOO的项目(或在本例中为项目数组)时,malloc()会在逻辑上返回FOO *你应强制转换 malloc()的返回值,但无论如何你的演员都是错的,应该是:

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

但是,evenint **,它是指向int *evenmain()变量的指针。要让main()看到结果,您必须取消引用传递给函数的指针。如前所述,您不应该转换malloc()的结果,因为它可以在缺少原型时屏蔽错误,这可能导致最坏情况下的未定义行为。

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

在C中,变量mimics的声明使用。因此int **even表示**evenint。因此,要正确分配int值,必须将even解除引用两次。第一次到达malloc()分配的数组,第二次到达所需的索引位置。那么,你的任务陈述:

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

是错误的,因为它正在为int类型分配int *值,因为even仅被解除引用一次。由于even是指向int *的指针,因此请使用:

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

同样,对odd函数参数进行相同的更正。