c-为什么访问我的矩阵会给我一个seg错误



当我试图访问矩阵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;
}

相关内容

  • 没有找到相关文章