在循环中使用 Realloc
Realloc used in a loop
我正在尝试模拟使用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
首先,您根据可能对 k
或 j
的多个值有效的条件重新分配内存。其次,当 realloc 失败时,您返回null
并尝试通过 do 访问内存0
Xcc[i][num[i]] = k;
问题
- 矩阵的作用是什么?
- 你为什么不修改
matrix
matrix[i*cols +k] == 0
是真的?
言论
- 没有空间时不要增加
1
!IT 效率非常低,因为在某些点之后,每次插入都需要一个重新分配。
你不需要reallocf
.当 realloc 失败时,原始内存保持不变。如果无法为新项分配更多空间,请停止插入方法并返回错误。
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 在基于范围的for循环中使用结构化绑定声明
- 用于C++中带有数组和指针的循环
- 循环中的随机函数
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 在循环中使用 Realloc