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

标签 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);
}

}

最佳答案

你必须声明函数 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)

可以为零甚至为负数。

关于c++ - 将指针传递给函数并使用 realloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27593351/

相关文章:

c++ - 在 C 和 C++ 中解析 typedef

c++ - GL_SPOT_CUTOFF 的意外行为

C++ 关于方法的引用

C - 当负数字符(-128)始终被编码为其二进制的 2 补码时,其符号位在哪里?

c - 在C中修改文本文件的内容

java - 将 JNA 指针从一个 Java 应用程序发送到另一个 Java 应用程序

c# - 使用 COM Callable Wrapper 处理 firebreath PluginAPI.cpp 中的 c# 触发事件

c - 跟随 malloc(0) 返回的指针

c - 为什么我不能打印地址 0 的值?

c - 二叉搜索树难点