我尝试了以下操作来重新分配大小从2X2变为3X3的2D float
阵列。该代码在尝试为weights[2]
调用realloc
内存时抛出一个segfault
。
num_vertices = 2;
float **weights = malloc(num_vertices*sizeof(float *)); // weight array matrix
for(i = 0; i < num_vertices; i++){
weights[i] = malloc(num_vertices*sizeof(float));
}
num_vertices = 3;
weights = realloc(weights, num_vertices*sizeof(float *)); // weight array matrix
for(i = 0; i < num_vertices; i++){
weights[i] = realloc(weights[i], num_vertices*sizeof(float));
}
当然,我可以再次free
2D阵列和malloc
,但我正在寻找一个更优雅的解决方案。有什么想法吗?
问题是在您重新分配weights
之后,weights[2]
包含垃圾。
你可能想做这样的事情:
new_vertices = 3;
weights = realloc(weights, new_vertices*sizeof(float *));
for(i = 0; i < new_vertices; i++)
{
if (i >= num_vertices)
weights[i] = NULL;
weights[i] = realloc(weights[i], new_vertices*sizeof(float));
}
num_vertices = new_vertices;
请注意,如果realloc失败,则可能会发生内存泄漏。由于您还没有错误检查,尽管这可能目前并不重要。
weights[2]
的realloc正在尝试重新分配未分配的内存,因为weights[2]
从未被分配任何指针。
通常,如果您想要一个2D数组,只需使用wegihts[width*y + x]
对数组进行索引,而不是制作一个指针数组。
您不能循环到新的垂直计数,因为外部数组的该部分尚未分配,并且包含未初始化的数据。相反,循环到新的num_vertices - 1
并重新分配,然后创建一个全新的weights[num_verticees - 1]
。