当我尝试访问Line***
的矩阵时,我得到一个段错误。
一个简单的操作,如(matrix[i][j]->vbit == 00),{int vbit}
给我一个分段错误。我假设它在构造函数中,但我似乎无法找到问题。有人看到了吗?
Line ***getSets(int width, int height){
int i;
int j;
Line *temp;
Line line;
printf("Make %d sets with %d lines\n",height,width);
Line*** matrix = (Line***)calloc(height,sizeof(Line**));
for(i=0;i < height;i++){
matrix[i] = (Line**)calloc(width,sizeof(Line*));
}
/// Set all vbits to 0
for(i = 0; i < height;i++){
for(j = 0;j <width; j++){
temp = matrix[i][j];
temp = malloc(sizeof(Line));
temp->vbit = 0;
temp->tag = 0;
temp->lastUsed = 0;
}
}
return matrix;}
答案 0 :(得分:2)
你只分配给temp,而不是你的实际矩阵元素:
temp = matrix[i][j];
temp = malloc(sizeof(Line));
请改为:
matrix[i][j] = malloc(sizeof(Line));
temp = matrix[i][j];
或者
for(j=0; j<width; j++) {
temp = malloc(sizeof(Line));
memset(temp, 0, sizeof(Line));
matrix[i][j] = temp;
}
另外,你真的应该检查calloc和malloc的结果。
答案 1 :(得分:0)
根据经验:只要您认为需要超过2级间接,始终就意味着您的程序设计从根本上被打破。
在这种情况下,您提出了3级间接,因为您没有正确分配多维数组。你应该这样做like this。
话虽如此,即使您正确分配动态内存,问题的根源仍然是程序设计。考虑做一些完全不同的事情例如,你的程序说它正在制作x组y行。那为什么不呢?创建一个集合类。以下是可以通过其他功能进行扩展的替代设计示例:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// assuming: 1 set has several lines, 1 line has several coordinates
typedef struct
{
// whatever you want in here, doesn't matter
int x;
int y;
} line_t;
typedef struct
{
size_t lines_n;
line_t* line;
} set_t;
bool get_sets (size_t height, size_t width, set_t set[height])
{
for(size_t i=0; i<height; i++)
{
set[i].lines_n = width;
set[i].line = malloc( sizeof(line_t[width]) );
if(set[i].line == NULL)
{
return false;
}
for(size_t j=0; j<width; j++)
{
// initialize all members:
set[i].line[j].x = 0;
set[i].line[j].y = 0;
}
}
return true;
}
int main (void)
{
int height = 3;
int width = 5;
set_t set [height];
printf("Make %d sets with %d lines\n", height, width);
bool result = get_sets(height, width, set);
if(result == false)
{
// out of memory error
}
return 0;
}