在C递归函数中作为引用传递的数组的动态内存分配

时间:2014-04-13 16:44:53

标签: c memory dynamic recursion allocation

我想计算我的递归嵌套多少并返回在函数内创建的数组中的每个级别数,但该代码无法正常工作(它显示"分段错误&#34 ;跑的时候):

void test (int* result[], int* counter) {


  if (*counter == 0)
        *result = (int**) malloc(0);

    if (*counter == 5)
        return;

    else {
        *counter = *counter + 1;
        *result = (int**) realloc(*result, sizeof(int) * (*counter));
        *result[*counter - 1] = *counter; // This line is wrong, and I don't know why.
        test(result, counter);
    }
}

void main () {
    int** result;
    int counter = 0;

    test(result, &counter);

    int i;
    for (i = 0; i < 5; i++)
        printf("%d\n", *result[i]);
}

我知道我可以使用单个指针作为参数和返回值来实现。关键是,我只是好奇。

2 个答案:

答案 0 :(得分:3)

test()的代码对我来说看起来很好(我没有测试过,所以我无法肯定地说),但这在main()中是错误的:< / p>

for (i = 0; i < 5; i++)
    printf("%d\n", *result[i]);
}

你想要(*result)[i]。数组索引的优先级高于指针解除引用。

您也不应该提出malloc()的返回值(请参阅Do I cast the result of malloc?),尤其是因为您做错了:*result的类型为{{1}所以如果你想保持演员表,至少把它改为int *,但我建议你把它全部取下来。

<强>更新

这一行也是如此:

int *

应该是:

*result[*counter - 1] = *counter;

答案 1 :(得分:1)

所有可疑或错误的行的概述,原因如下:

*result = (int**) malloc(0);

该行可以将*result设置为0,也可以设置为必须为free d的唯一值。此外,由于*result类型为int*,因此广告素材是多余的错误。

*counter = *counter + 1;

上面对标准增量运算符大喊:++*counter;

*result = (int**) realloc(*result, sizeof(int) * (*counter));

除了上面用malloc标识的类型和演员问题之外,最好以这种方式编写,以避免使用错误的尺寸:*result = realloc(*result,*counter * sizeof *result);

*result[*counter - 1] = *counter; // This line is wrong, and I don't know why.

运算符优先级表示您需要添加括号:(*result)[*counter - 1] = *counter;

void main () {

唯一受祝福的主要原型是int main(void)int main(int argc, char* argv[argc])或兼容。实现也可能允许其他人,尽管它们是不可移植的。

int** result;

x你想在这里int*,因为你想把它作为test的参考参数。

test(result, &counter);

评论x表示您需要获取上面result的地址。

for (i = 0; i < 5; i++)

您可以考虑使用*counter作为通用性限制,但在您的情况下test实际上总是将其设置为5。

printf("%d\n", *result[i]);

删除解除引用以获得良好结果,如评论x所示。