我试图模拟使用push_back时 vector 容器的行为。我创建了一个指针数组。每个元素可以有不同的长度,因此每次存储新元素时我都需要重新分配:
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];
对于通用 i,Xcc[i] 未初始化,则对 realloc() 的调用有时可能有效(如果 Xcc[i] 为 null),有时则可能无效(段错误)。
您缺少:
memset(Xcc, 0, sizeof(int*) * rows);
关于c++ - 在循环中使用 Realloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12428150/