添加阵列程序不起作用

时间:2015-06-20 00:44:05

标签: c arrays pointers

我正在学习C,我刚刚完成了指针部分。这本书要求编写一个程序,通过将指针传递给一个函数,将两个数组一起添加到一个数组中。我仔细检查了代码,这一切看起来都不错,但由于某种原因,输出会产生混合结果。如果出现问题,有人可以告诉我。

//
//  main.c

#include <stdio.h>
#include <unistd.h>

int *AddArrays(int *A, int *B, int a, int b);

int main(void)

{
    int A[5] = {1,2,3,4,5};
    int B[7] = {6,7,8,9,10,11,12};
    int a = 5;
    int b = 7;
    int c = a + b;
    int x = 0;
    int NewArray[c], *ArrayPtr;

    ArrayPtr = AddArrays(A,B,a,b);

    for( x = 0; x < c; x++)
    {
        *(NewArray + x) = *ArrayPtr;

        printf("Value of NewArray[%d] = %d\n", x, *(NewArray+x));
        sleep(1);

        ArrayPtr++;
    }


    return 0;
}

int *AddArrays(int *A, int *B, int a, int b)
{
    int c;
    int d;
    int NewArray[a+b];

    for (c = 0; c < a; c++)
    {
        NewArray[c] = *A;
        A++;

    }

    for (d = 0; c < d; d++)
    {
        NewArray[a] = *B;
        a++;
        B++;
    }

    return NewArray;
}

注意:我认为不需要使用malloc(),因为指定了数组的大小并且显式声明了新的数组大小。

奖金问题:有没有办法让函数动态响应数组类型。函数原型仅用于整数,并返回类型为“int”的指针。这仅仅是在变量前面添加奇怪的转换(类型)吗?

2 个答案:

答案 0 :(得分:2)

使用malloc的理由。

本声明:

return NewArray;

返回指向数组第一个元素的指针。但是你在堆栈上声明了数组(即不是动态的,没有malloc),所以一旦控制传递出函数,数组就会超出范围而不再安全使用。你以后使用它会导致未定义的行为,如果你得到的只是随机数,你就很幸运。

使NewArray静态不是一个好的解决方案。首先,这意味着你只能使用一次该函数 - 如果你再次调用它,它将用新参数的内容覆盖数组,并且前一次调用的结果将以你几乎改变的方式改变当然不打算。

您也可以在函数外部声明NewArray并传入指向它的指针;两种设计之间的选择取决于具体情况,但如果您正在尝试学习该语言,那么我建议您尝试两种设计。

答案 1 :(得分:0)

在AddArray的第二个循环中,你想要d&lt; b而不是c&lt; d。第二个循环永远不会按原样执行,因为d从零开始,c在第一个循环后总是大于零。