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

时间:2016-05-03 02:52:04

标签: c arrays pointers matrix segmentation-fault

当我尝试访问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;}

2 个答案:

答案 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;
}