整数数组数组的最后一个值将覆盖所有其他值

时间:2017-12-10 03:54:09

标签: c arrays

我正在尝试将4个数组存储在一个数组中,由于某种原因,最后一个值会覆盖前三个值。例如,如果123; 456; 789; 987被输入到下面的代码中,ipadr[0] - ipadr[4]将仅存储123。我已经过测试以确保numConvert()正常工作,并且在numConvert内,会返回4个不同的ints数组,但只有numConvert(d)ipadr数组(存储4次)。

另外,我的语法/代码是否正确,以便此函数将ipadr作为数组(int**)返回?为什么在初始化数组时需要使它static int*

我是C的新手,这让我非常沮丧。任何帮助都会非常感激。提前谢谢!!

   int** ipConvert(int a, int b, int c, int d){
        static int* ipadr[4];
        ipadr[0]=numConvert(a);
        ipadr[1]=numConvert(b);
        ipadr[2]=numConvert(c);
        ipadr[3]=numConvert(d);
        return ipadr;
    }

numConvert代码:

     int* numConvert(int dec) {
        static int hold[8];
        ...
        return hold;
    }

3 个答案:

答案 0 :(得分:2)

每次调用numConvert后, hold 数组确实会被覆盖,因为它是一个8 int的静态区域。

更好地使用malloc进行动态分配,并使该函数分配8个整数。

int* numConvert(int dec) {
    int *hold = (int *)malloc(sizeof(int) * 8); // C++ need cast!
    int x = dec;
    for(int y=7;y>=0;y--){
        if(x%2==0 || x==0){
            hold[y]=0;
        }
        else{
            hold[y]=1;
        }
        x=x/2;
    }
    printf("\ntest loop: ");
    for(int i=0;i<8;i++){
      printf("%i", hold[i]);
    }
    printf("\n");

    return hold;
}

然后,在您不再需要它们之后,必须释放返回的值。

至于 static this answer详细解释了它。

答案 1 :(得分:1)

每当你在hold中写一些东西然后返回它时,你基本上会覆盖以前的值。有hold的单个实例不是你可能想到的多个。

您在不知道完整功能的情况下使用的

static关键字。它与自动存储持续时间不同。

int* numConvert(int dec) {
    int *hold = malloc(sizeof *hold *8);
    if( hold == NULL){
       fprintf(stderr,"Error in malloc");
       exit(1);
    }
    int x = dec;
    ....
    ....
    return hold;
}

使用完毕后释放动态分配的内存。

我们在这做了什么?

动态分配的内存的生命周期超出了函数的范围。就像它保持活跃的static一样。但每次分配新的内存块时,与static变量相反。为此,我们不会覆盖任何内容,这是您案件中的主要问题。

还有一件事......

hold具有自动存储持续时间,这意味着每次退出函数时hold都会被释放,然后当我们调用它时,我们会得到一个名为hold的局部变量。所以在每个我们得到不同的实例。这就是我们返回hold中包含的地址的原因。地址保持包含的存储器具有超出功能范围的寿命。因此它与本地变量hold不同,我们将此地址存储在其他函数中。

答案 2 :(得分:0)

将hold变量声明为实例变量,而不是静态变量,如

 int* numConvert(int dec) {
    int hold[8];