将指针传递给函数并使用realloc

时间:2014-12-21 20:14:08

标签: c++ c pointers malloc realloc

我想传递一个指向函数的指针,该函数将调用将使用realloc的第二个函数。 问题是realloc返回NULL。

我不知道错误是在函数调用中的*数字还是别的。

你能帮我吗?

代码:

int main(){

// some code.
clause_t* ptr; //clause_t is a structure i declared.

//Some work including the initial allocation of ptr (which is working).

assignLonely(matSAT, ic.nbClause, ic.nbVar, ptr); //the issue is here.

//Some other work
}

void assignLonely(int** matSAT, int nbClause, int nbVar, clause_t* ptr)
 {

   int i = 0, j = 0;
   int cpt = 0;
   int indice = -1; 

for (i = 0; i < nbClause ; ++i)
{
    j = 0;
    cpt = 0;
    while((j < nbVar) && (cpt < 2))
    {
        if (matSAT[i][j] != 0)
        {
            cpt++;
        }
        else
        {
            indice = j;
        }

        if (cpt < 2)
        {
            deleteClause(indice, &ptr);
        }

        j++;
    }
}
}

void deleteClause(int indiceClause, clause_t** ptr)
{
    int i = indiceClause;
    int nbElt = sizeof((*ptr))/sizeof((*ptr)[0]);
    int tailleElt = sizeof((*ptr)[0]);

while(i+1 < nbElt)
{
    (*ptr)[i] = (*ptr)[i+1];
    i++;
}

*ptr = (clause_t*)realloc(*ptr, (nbElt-1)*tailleElt);
if (*ptr == NULL)
{
    fprintf(stderr, "Erreur reallocation\n");
    exit(EXIT_FAILURE);
}

}

1 个答案:

答案 0 :(得分:2)

您必须声明函数assignLonely,类似于函数deleteClause,如

void assignLonely(int** matSAT, int nbClause, int nbVar, clause_t** ptr);

如果您希望函数中ptr的更改将存储在main中的原始对象中。

还要考虑到这个陈述

int nbElt = sizeof((*ptr))/sizeof((*ptr)[0]);

错了。 表达式sizeof((*ptr))将返回指针的大小。指针不保存有关它们指向的数组中有多少元素的信息。

所以表达

(nbElt-1)

可以等于零甚至是负数。