在将数组传递给另一个函数后,为什么我的数组保留垃圾值/分段错误?

时间:2019-04-03 01:49:38

标签: c arrays pointers malloc pass-by-reference

我有一个函数,该函数分配一个数组以保存要编码的值。将值编码为整数数组后,该数组本身将通过引用传递(至少是理论值)。但是,在编译函数时,我得到的是垃圾值,所以我开始向各处抛出打印语句,以查看发生了什么。在第二个函数被调用并传递数组之后,我立即意识到print语句存在段错误,这对我来说很奇怪。

主要功能:

void    top_left_justify(char **pieces)
{
    int i;
    int j;
    int count;
    int *values; //array to be passed

    i = 0;
    if (!(values = (int *)malloc(sizeof(int) * 4)))
        return ;
    while (pieces[i] != 0)
    {
        j = 0;
        count = 0;
        while (pieces[i][j])
        {
            printf("count = %d\n", count);
            if (pieces[i][j] == '#')
                values[count++] = j;
            j++;
        }
        printf("encoded indexes are: %d, %d, %d, %d\n", values[0], 
values[1], values[2], values[3]); //test printout shows me it works here
        top_left_helper(&values, pieces[i]); //PASS BY REFERENCE??
        i++;
    }
}

但是,在将其传递给此函数之后:

void    top_left_helper(int **values, char *pieces)
{
    int i;
    int j;

    i = 0;
    j = 0;
    printf("value of values[0] = %d\n", *values[0]); //prints correct value
    printf("value of values[0] = %d\n", *values[1]); //segfaults
    left_helper(&*values);
    top_helper(&*values);
    while (i < 16)
        pieces[i++] = '.';
    while (j < 4)
        pieces[*values[j++]] = '#';
}

在第二个打印语句上出现段错误。除了我误解了如何通过引用和内存传递参数外,我真的看不到对此的解释。请说明一下。

编辑: 经过一些测试,看来如果我通过增加指针而不是数组访问来打印出值,则能够正确访问要打印的值。但这对我来说仍然没有任何意义,为什么数组访问不起作用。 (在第二个功能中添加了以下行)

printf("value of values[0] = %d\n", **values);
*values = *values + 1;
printf("value of values[1] = %d\n", **values);
*values = *values + 1;
printf("value of values[2] = %d\n", **values);
*values = *values + 1;
printf("value of values[3] = %d\n", **values);

1 个答案:

答案 0 :(得分:2)

这不是您想的那样:

*values[1]

[]的优先级比*高,因此这首先将values索引为数组,然后取消对其返回的值的引用。但是传递给此函数的是指向变量的指针,该变量也是指针。因此values[1]没有任何意义。您摆脱*values[0]的困扰,因为它与**values相同:

(*values)[1]

但是,除非您需要修改vaules本身,例如在其上使用realloc,否则不需要传递其地址。就像使用int *一样将其作为pieces[i]传递:

void    top_left_helper(int *values, char *pieces)
{
    int i;
    int j;

    i = 0;
    j = 0;
    printf("value of values[0] = %d\n", values[0]);
    printf("value of values[0] = %d\n", values[1]);
    left_helper(values);    // probably need to change left_helper the same way
    top_helper(values);     // and also top_helper
    while (i < 16)
        pieces[i++] = '.';
    while (j < 4)
        pieces[values[j++]] = '#';
}

然后相应地更改呼叫:

top_left_helper(values, pieces[i]);