当我试图访问矩阵Line***
时,我会遇到seg错误。像(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 linesn",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;}
您只分配给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的结果。
根据经验:每当您认为需要两个以上的间接层时,总是意味着您的程序设计从根本上被破坏了。
在这种情况下,您提出了3个间接级别,只是因为您没有正确分配多维数组。你应该这样做。
话虽如此,即使你能正确地分配动态内存,问题的根源仍然是程序设计。考虑做一些完全不同的事情。例如,你的程序说它正在制作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 linesn", height, width);
bool result = get_sets(height, width, set);
if(result == false)
{
// out of memory error
}
return 0;
}