我正在使用 posix_memalign 分配内存,但是当我尝试使用向量时出现分段失败
I am using posix_memalign to allocate memory, but when I try to use the vector I get segmentation failure
我创建了以下函数,将方阵的所有元素转化为适当的向量 size.The 函数与 malloc 一起正常工作,但我需要使用 posix_memalign 创建向量,并且那里发生了错误。
void convert_matrix_to_vector(int **matrix, const int matrixSize, int **vector, int *vectorSize){
int *vectorAux, i, j, k, vectorSizeAux;
vectorSizeAux = matrixSize * matrixSize;
posix_memalign((void **)&vectorAux, vectorSizeAux, vectorSizeAux * sizeof(int));
k = 0;
for (i = 0; i < matrixSize; i++){
for (j = 0; j < matrixSize; j++){
vectorAux[k] = matrix[i][j];
k++;
}
}
free_matrix_memory(matrix, matrixSize);
*vector = vectorAux;
*vectorSize = k;
}
当我运行程序时,vectorSizeAux的值为16。
出现的错误是:Program received signal SIGSEGV, Segmentation fault.
尝试执行行时:
vectorAux[k] = matrix[i][j];
此回答感谢用户“某程序员”:
POSIX 参考页指出对齐必须是 2 的幂并且是 sizeof(void*) 的倍数。如果您使用的是 64 位系统,则 sizeof(void*) 将为 8,这会使 4 成为无效对齐。
这就是为什么 vectorSizeAux 的最小大小必须为 8 的原因,当 运行 程序为其指定值 4、8 和 16 时我遇到了错误。在值 4 中,posix_memalign失败,执行停止,我不再使用其他值。
我创建了以下函数,将方阵的所有元素转化为适当的向量 size.The 函数与 malloc 一起正常工作,但我需要使用 posix_memalign 创建向量,并且那里发生了错误。
void convert_matrix_to_vector(int **matrix, const int matrixSize, int **vector, int *vectorSize){
int *vectorAux, i, j, k, vectorSizeAux;
vectorSizeAux = matrixSize * matrixSize;
posix_memalign((void **)&vectorAux, vectorSizeAux, vectorSizeAux * sizeof(int));
k = 0;
for (i = 0; i < matrixSize; i++){
for (j = 0; j < matrixSize; j++){
vectorAux[k] = matrix[i][j];
k++;
}
}
free_matrix_memory(matrix, matrixSize);
*vector = vectorAux;
*vectorSize = k;
}
当我运行程序时,vectorSizeAux的值为16。
出现的错误是:Program received signal SIGSEGV, Segmentation fault.
尝试执行行时:
vectorAux[k] = matrix[i][j];
此回答感谢用户“某程序员”:
POSIX 参考页指出对齐必须是 2 的幂并且是 sizeof(void*) 的倍数。如果您使用的是 64 位系统,则 sizeof(void*) 将为 8,这会使 4 成为无效对齐。
这就是为什么 vectorSizeAux 的最小大小必须为 8 的原因,当 运行 程序为其指定值 4、8 和 16 时我遇到了错误。在值 4 中,posix_memalign失败,执行停止,我不再使用其他值。