【发布时间】:2016-04-09 00:16:26
【问题描述】:
我目前正在堆上实现floats 的 N x 2 矩阵,如下所示:
float **matrix = malloc(sizeof(float*) * n_cols);
for (int i = 0; i < n_cols; ++i) {
matrix[i] = malloc(sizeof(float) * 2);
}
matrix 的元素在内存中不连续,使得这个数据结构缓存不友好(据我理解)。我正在尝试重写上面的内容以在堆上创建一个真正的二维数组。根据之前的一些 SO 帖子,我尝试了以下方法:
float (*matrix)[2] = malloc(sizeof(float) * n_cols * 2);
但是,当我运行我的代码时,这会导致分段错误。
【问题讨论】:
-
连续是什么意思?您可以在一个卡盘中分配它,但您访问它的方式将决定缓存的友好性。
-
@Pemdas 连续我的意思是类似于二维数组在堆栈上的存储方式,即所有元素都相互连接,因此从一行的末尾到另一行的开头不会需要内存跳跃。
-
您的示例是正确的,您没有显示重现问题的代码。
标签: c arrays segmentation-fault malloc