在循环中使用 Realloc

Realloc used in a loop

本文关键字:Realloc 循环      更新时间:2023-10-16

我正在尝试模拟使用push_back时矢量容器的行为。我创建了一个指针数组。每个元素可以有不同的长度,所以我需要在每次存储新元素时重新分配:

   void *reallocf(void *p, size_t s)
{
    void *tmp = realloc(p, s);
    if(tmp) return tmp;
    free(p);
    return NULL;
}
int main(){
   int rows = 9000;
   int cols = 23000; 
   int *matrix = (int*)malloc(sizeof(int)*rows*cols);
   //counter of elements
   int *nums = new int [rows];
   memset(num, 0, sizeof(int)*rows)
    /* populate matrix*/
            ....
   int **Xcc = new int *[rows];

  for(i = 0; i < rows; i++){
      for(k = 0; k < cols; k++){
          if(matrix[i*cols +k] == 0){
             Xcc[i] = (int*) reallocf(Xcc[i], sizeof(int)*(num[i]+1));
             Xcc[i][num[i]] = k;
             num[i]++;
          }
       }
   }

}

基本上我正在做的是存储一个元素的位置,即 0。因此,数组Xcc[i]每次需要时都会增加一个元素。新的长度将是前一个加 1,将被存储。

显然对我来说似乎很好,但是这取决于我正在segmentation faults的东西,在从许多不同的角度看它之后,我目前陷入了困境。任何帮助都会很棒,想法或建议。

问题可能是这样的:当你这样做时

int **Xcc = new int *[rows];
Xcc[i],

对于泛型i,没有初始化,那么对realloc()的调用有时可能有效(如果Xcc[i]为空),有时可能不工作(段错误)。

您缺少:

memset(Xcc, 0, sizeof(int*) * rows);

您不需要通过 realloc 显式free重新分配的指针。 realloc释放传递给它的指针(如果不是NULL)。

因此,请从reallocf()函数中删除free(p);

正如@Joachim Pileborg指出的那样,您无法重新分配分配的内存new。所以把new改成malloc.

 if(matrix[i*cols +k] == 0){
         Xcc[i] = (int*) reallocf(Xcc[i], sizeof(int)*(num[i]+1));
         Xcc[i][num[i]] = k; // bad access here

首先,您根据可能对 kj 的多个值有效的条件重新分配内存。其次,当 realloc 失败时,您返回null并尝试通过 do 访问内存0

  Xcc[i][num[i]] = k;

问题

  • 矩阵的作用是什么?
  • 你为什么不修改matrix matrix[i*cols +k] == 0是真的?

言论

  • 没有空间时不要增加1!IT 效率非常低,因为在某些点之后,每次插入都需要一个重新分配。

你不需要reallocf.当 realloc 失败时,原始内存保持不变。如果无法为新项分配更多空间,请停止插入方法并返回错误。