-2

我试图模拟使用 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并且在从许多不同的角度观察它之后,我目前被卡住了。任何帮助都会很棒,想法或建议。

4

3 回答 3

3

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

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

对于泛型 i,Xcc[i] 未初始化,那么对 realloc() 的调用有时会起作用(如果 Xcc[i] 为空),有时可能不起作用(segfault)。

您缺少一个:

memset(Xcc, 0, sizeof(int*) * rows);
于 2012-09-14T16:37:22.650 回答
2

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

所以free(p);从你的reallocf()功能中删除。

正如@Joachim Pileborg 指出的那样,您不能重新分配分配给new. 所以new改为malloc.

于 2012-09-14T16:12:01.787 回答
1
 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

k首先,您正在根据对or的多个值有效的条件重新分配内存j。其次,当重新分配失败时,您返回并尝试通过执行null来访问内存0

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

问题

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

评论

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

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

于 2012-09-14T16:16:36.080 回答