【问题标题】:C: Return even number in array program by using pointers, why does my program crush after printing the resultC:使用指针返回数组程序中的偶数,为什么我的程序打印结果后会崩溃
【发布时间】:2015-01-20 05:05:33
【问题描述】:

这是我的简单程序,生成一个包含 N 个整数的数组,打印出来,它会调用 getevennumber 函数,该函数将返回数组中偶数的指针地址。主程序将打印数组中的偶数:

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

    int main (){
        int N;
        printf("Enter N: ");
        scanf("%d", &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(test); i++){
            printf("%d \n", *test[i] );
        }


        return 0;
    }

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

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

    }

目前的问题是:当我运行程序时,它会打印想要的偶数,然后程序也会打印2个随机数据地址然后粉碎,这是一个示例输出:

人数:10
66
19
70
54
84
12
35
56
53
19


66
70
54
84
19
1981890690
-1090571325
(程序崩溃)

谁能帮我找出问题,谢谢!

【问题讨论】:

  • 检查你的代码:int i,j = 0; int* ptr[j];
  • 您还试图在函数内填充数组,因此您需要传递一个指向数组的指针,例如 int ** arrayPtr。
  • 除非我误读了您的代码,否则您将返回一个指向局部变量的指针,这意味着当您在调用代码中使用它时,一切都会崩溃。

标签: c arrays pointers


【解决方案1】:
for(i = 0; i <= sizeof(test); i++){
        printf("%d \n", *test[i] );
    }

sizeof(test) 不是数组 test 中的元素数,它是 sizeof(int*) ,即 8(字节),假设您使用的是 64 位系统。它返回指向内存地址的指针的大小,而不是数组的实际长度。所以你的循环超出了数组的范围,这可能会导致你的问题。

您还返回了一个局部变量,这可能会导致其他问题。

【讨论】:

    【解决方案2】:

    在函数getEvenNumber 中,您正在创建一个局部变量ptr,您将返回该地址。你不应该这样做,因为局部变量只存在于函数中,而从不在函数之外。此外,您实际上是在返回 ptr 的第一个元素的值(因为您正在取消引用它)。这就是 *test[i] 失败的原因,因为您永远不会返回实际数组,因此无法使用 [i] 对其进行迭代。

    最好的解决方案是在主函数中声明数组并像这样传递它getEvenNumber(int a[], int *ptr[])

    并且不要将你的数组声明为大小为零......(就像你目前对 ptr 所做的那样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多