我有一系列数字.. 需要什么:通过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 ..但我不知道为什么......
答案 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);
您的第一个线索是错误的应该是even
和odd
输出参数到您的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参数传回一个值,您需要一个指向变量的指针,该变量将保存传回的值。但是,在该函数中,您需要取消引用指针以更改存储在变量中的值,以便调用者看到传回的值。 (您可以使用计数器函数参数evensize
和oddsize
。
举一个例子,您的even
数组的分配方式如下:
even=(int**)malloc(sizeof(int)*cnte);
当您动态分配类型为FOO
的项目(或在本例中为项目数组)时,malloc()
会在逻辑上返回FOO *
。 你应不强制转换 malloc()
的返回值,但无论如何你的演员都是错的,应该是:
even=(int*)malloc(sizeof(int)*cnte);
但是,even
是int **
,它是指向int *even
中main()
变量的指针。要让main()
看到结果,您必须取消引用传递给函数的指针。如前所述,您不应该转换malloc()
的结果,因为它可以在缺少原型时屏蔽错误,这可能导致最坏情况下的未定义行为。
*even=malloc(sizeof(int)*cnte);
在C中,变量mimics的声明使用。因此int **even
表示**even
是int
。因此,要正确分配int
值,必须将even
解除引用两次。第一次到达malloc()
分配的数组,第二次到达所需的索引位置。那么,你的任务陈述:
even[e++]=a[i];
是错误的,因为它正在为int
类型分配int *
值,因为even
仅被解除引用一次。由于even
是指向int *
的指针,因此请使用:
(*even)[e++] = a[i];
同样,对odd
函数参数进行相同的更正。