【问题标题】:Passing double pointer inside a function recursive [closed]在函数递归内传递双指针[关闭]
【发布时间】:2018-10-12 20:26:39
【问题描述】:

我需要在递归函数中传递一个双指针来重新分配这个大小。这是函数:

int main(){
    PERSONA *tablaHash = (PERSONA *) malloc(1 * sizeof(PERSONA));
     redimensionar(&tablaHash, regToInput, 1, "TypeA", 1);
    return 0;
};

int redimensionar(PERSONA **tablaHash, PERSONA reg, int tam, int tipoPruebaColision, int n) {
    if (n < 15) {
        n *= 2;
        *tablaHash = realloc( *tablaHash, (n*tam) * sizeof(PERSONA) );
        return ( redimensionar(tablaHash, reg, n*tam, tipoPruebaColision, n) ); //HERE IS THE ERROR
    }
    else {
        insertar(*tablaHash, reg, tam, tipoPruebaColision);
        return (tam);
    }
}

这个函数没有重新分配好内存(过程很好,错误在递归调用中)。我已经尝试过这个功能,它工作正常:

int redimensionar(PERSONA **tablaHash, PERSONA reg, int tam, int tipoPruebaColision, int n) {
        n *= 2;
        *tablaHash = realloc( *tablaHash, (n*tam) * sizeof(PERSONA) );
        insertar(*tablaHash, reg, tam, tipoPruebaColision);
}

所以内存重新分配很好,问题是将双指针传递给递归函数。知道应该如何通过吗?

问题是:如何将双指针传递给递归函数以使其正常工作?第一个条目很好,递归条目没有,所以指针在递归中没有很好地传递。

谢谢。

【问题讨论】:

  • 您是否阅读过minimal reproducible example,这对于人们做出快速准确的回答非常重要。
  • insertar(tablaHash...)
  • 另外:你没有完全正确地使用realloc...
  • 你是如何创建指针的?你是怎么调用这个函数的?
  • 请不要在cmets后修改代码。只需发布显示问题的Minimal, Complete, and Verifiable example

标签: c pointers recursion dynamic-memory-allocation


【解决方案1】:

经过 8 次迭代,tam 变得如此之大,以至于溢出并变成了0

1. n = 2,tam = 1 2. n = 4,tam = 2 3. n = 8,tam = 8 4. n = 16,塔姆 = 64 5. n = 32, 塔姆 = 1024 6. n = 64,塔姆 = 32768 7. n = 128,tam = 2097152 8. n = 256,tam = 268435456 9. n = 512,塔姆 = 0

因此,您尝试分配 0 字节,而 realloc 返回 NULL。你应该经常检查malloc()/realloc()是否返回NULL。

【讨论】:

  • 谢谢,我已经检查过了,永远不要返回null。问题是,很明显,realloc 不是 realloc 父变量,只是局部变量,但是我通过引用传递了父变量并且我正在更新它的值......所以我不知道发生了什么
  • @JuMoGar 迭代次数更少,它在我的测试中运行良好:ideone.com/ZqRzlB ....等等,你是否意识到,realloc() 可以保持指针不变但仍然成功?跨度>
  • 是的,谢谢,我已经看到了这个答案的问题。这是父变量中的一个小错误
猜你喜欢
  • 2017-10-13
  • 1970-01-01
  • 2020-06-04
  • 2014-06-20
  • 1970-01-01
  • 2012-02-22
  • 2010-10-02
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多