c - 接受输入数组并输出指向数组中所有偶数的指针的函数

标签 c arrays sorting pointers crash

我的教授给了我这个

编写一个名为 getEvenNumbers 的函数。该函数的目的是处理 int 类型整数的输入数组并返回数组中的偶数列表。该函数需要能够处理任意长度的输入数组。函数的返回类型必须是“int *”,即指向int的指针,即函数返回一个指向偶数列表内存的指针。不允许使用全局变量。除了这些要求外,你可以自由来设计这个函数。你还需要编写一个测试程序(即主函数)来证明你的这个函数的设计和实现是正确的。你的测试程序需要执行以下操作:首先它要求用户输入一个正整数N,然后它生成一个长度为 N 的随机整数数组;然后调用函数 getEvenNumbers 来获取该数组中的偶数列表,最后打印该列表。

我想出了代码

#include <stdio.h>
int* getEvenNumber(int a[]);

int main (){
    int N;
    printf("Enter N: ");
    scanf("%d", &N);
    int *ptr[N];
    int array[N], i;
    int *test[N];
    srand(time(NULL));
    for(i = 0; i < N; i++)
    {

        array[i] = (rand() % 100)+1;
        printf("%d \n", array[i]);

    }
    printf("------- \n");
    *test = getEvenNumber(array);
    for(i = 0; i <= sizeof(array); i++){
        printf("%d \n", *test[i] );
    }


    return 0;
}

int* getEvenNumber(int a[])
{
    int i,N = 0;
    int *ptr[N];
    for(i=0; i<=sizeof(a); i++)
    {

     if (a[i] % 2 == 0)
        {
           ptr[N] = &a[i];
           printf("%d\n",*ptr[N]);
           N++;
       }
    }
     return *ptr;
}

但是,在打印所有偶数后,程序崩溃并返回错误 255。我想知道如何修复代码,以便它在打印数字后停止崩溃,任何帮助将不胜感激..

最佳答案

您的getEvenNumber()不知道int a[]的大小。 sizeof(a) 为您提供 int* 的大小(指针的大小是特定于系统的,例如在 64 位机器上为 8)。 为了修复您的设计,您必须以某种方式将数组的大小传递给 getEvenNumber() 函数。 尝试向其中添加第二个参数,例如:

int* getEvenNumber(int a[], int len)

然后您必须修改代码,如下所示:

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

int* getEvenNumber(int a[], int* len);

int main (){
    int N;
    printf("Enter N: ");
    scanf("%d", &N);
    int array[N], i;
    int *test;
    srand(time(NULL));
    for(i = 0; i < N; i++)
    {

        array[i] = (rand() % 100)+1;
        printf("%d \n", array[i]);

    }
    printf("------- \n");
    test = getEvenNumber(array,&N);
    if(test)
    {
        for(i=0; i<N; i++)
        {
            printf("%d\n", test[i] );
        }
        free(test);
    }

    return 0;
}

int* getEvenNumber(int a[], int *len)
{
    int i,eNum=0,j = 0;
    int *ptr=0;
    for(i=0; i<*len; i++)
    {
     if (a[i] % 2 == 0)
        {
           eNum++;
        }
    }
    if(eNum>0)
    {
        ptr = (int*)malloc(eNum*sizeof(int));
        for(i=0;i<*len;i++)
        {
            if (a[i] % 2 == 0)
            {
               printf("%d\n",a[i]);
               ptr[j++]=a[i];
            }
        }
        *len = eNum;
    }
    return ptr;
}

关于c - 接受输入数组并输出指向数组中所有偶数的指针的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34125963/

相关文章:

algorithm - 归并排序中哨兵值的用途

c - 错误地址 C(命令行解释器)

.net - F#中的数组协方差

c - 一字节字符数组似乎存储 8 个输入字符串字符

java - 处理 Java Socket 中的一个或多个单词 .readLine()

php - 检查关联数组是否包含值,并检索数组中的键/位置

arrays - 这是什么类型的数组排序算法?

delphi - 按空格后的第一个字符对TStringList进行排序

c - C中 bool 表达式的结果

c - 从标准输入中划分数字和字符串