2d数组struct seg fault

时间:2014-08-08 19:01:35

标签: c arrays struct malloc

我是否正确地对我的结构进行了修改?如果是这样,为什么在第一个元素之后发生段错误。我对整个指针感到困惑,并使用结构取消引用。

问题:

  1. struct a
  2. 的2x2矩阵
  3. 包含行

    的文件fp
    5 4 3 2 1 1
    11 21 1 3 2 2
    
  4. 相关代码:

    结构

    typedef struct num{
          int s;
    }num_t;
    

    在main中使用a(注意n和m是整数,在我的运行时中:n = 2,m = 3)

    num_t **a;
    a =  malloc(sizeof(num_t *) * n);
    for(i=0;i<n;i++)
        a[i]=  malloc(sizeof(num_t) * m);
    
    //check if mallocs suceeded
    if(a==NULL)
        return -1;
    
    //read matrix.dat, check if correct size
    pb = matrix(n,m,&a,*(argv+3));
    

    我发生segfault的函数(跳到内循环的中间):

     int matrix(int n, int m, num_t ***a, char* file)
     {
     int i,j,k,count;
     int d,e;
     char z,w;
     FILE *fp;
    
          fp = fopen(file,"r");
          //check if file opened
          if(fp == NULL)
          {
                  fclose(fp);
                  return -1;
          }
          else
          {
                  i=0;
                  k=0;
                  count=0;
                  for(i=0;(k!=EOF)||i<n;i++)
                  {
                          printf("n=%d , m=%d\n",n,m);fflush(stdout);
                          for(j=0;j<m;j++)
                          {
                              //printf("Innit i=%d j=%d\n",i,j);fflush(stdout);
                              k=fscanf(fp,"%d",&d);
                              if(k!=1){
                                 j++;break;
                              } 
                              //printf("fscan1 passed\n");fflush(stdout);
                              k=fscanf(fp,"%d",&e);
                              if(k!=1){
                                  j++;break;
                              }
                              printf("fscanf2 passed\n");fflush(stdout);//prints
    
                              a[i][j]->s = d; //segfaults here
                              printf("dpassed\n");fflush(stdout); //doesnt print
    
                              a[i][j]->t = e;
                              //printf("dpassed\n");fflush(stdout);
                              if(j==m-1){
                                  count++;
                                  //printf("enter break\n");fflush(stdout);
                              } 
    
                              count++;
                              //printf("out j a[%d][%d] = %d and %d k=%d\n",i,j,a[i]      [j]->s,a[i][j]->t,k);fflush(stdout);
                         }
                   //printf("enter out i=%d\n",i);fflush(stdout);
                 }
                 //printf("brokenout");fflush(stdout);
                 if((k = fscanf(fp,"%lf",&d)) >0)
                        count++;
                 fclose(fp);
    
                //check matrix sizes
                if((i!=n) || j!=m-1 || count!=(n * m))
                     return -1;
         }
         return 1;
     }
    

    编辑: 无视w和z

    在运行时,我有这个:

    n=1 , m=3
    Innit i=0 j=0
    fscan1 passed
    fscanf2 passed
    a[0][0] = 0 and 0 k=1 w='' z=''
    dpassed
    dpassed
    out j a[0][0] = 5 and 4 k=1
    Innit i=0 j=1
    fscan1 passed
    fscanf2 passed
    [1]    13367 segmentation fault
    

    EDIT2:

    抱歉,我发布了2个不同项目的代码。 num_t是typedef结构,由于putty如何复制我的文件,我在粘贴时编辑代码时遇到问题

    EDIT3:

    格式和成品

    #include "header.h"//contains struct
    
    int read_matrix(int row, int col, num_t** a, char* file)
    {
    int i,j,k,count,d,e;
    FILE *fp;
    
        fp = fopen(file,"r");
    
        //check if file opened
        if(fp == NULL)
        {
              fclose(fp);
              return -1;
        }
        else
        {
              i=0;
              k=0;
              count=0;
              for(i=0;(k!=EOF)||i<row;i++)
              {
                    for(j=0;j<col;j++)
                    {
                        k=fscanf(fp,"%d%d",&d,&e);
                        if(k!=2){
                            break;
                        }    
                        a[i][j].s = d;
                        a[i][j].t = e;
                        if(j==col-1){
                             count++;
                        }   
                             count++;
                    }
              }
              fclose(fp);
    
              //check matrix sizes
              if((i!=row) || j!=col-1 || count!=(row * col))
                      return -1;
         }
         return 1;
    }
    

    主要:

    pb = matrix(m,x,a,*(argv+3));
    

    结论

    2D结构数组与2D int数组不同。不要在这种类型的函数中传递结构的地址。

3 个答案:

答案 0 :(得分:0)

而不是

a[i][j]->s = s

这样的代码会起作用。

 p = a[i];
 p[j].s = s;

答案 1 :(得分:0)

当您致电matrix()时,您会传递 a地址。如果您认为num_t **Matrix_t类型,那么您将指针传递给 Matrix_t

num_t **a;
...
pb = matrix(n,m,&a,*(argv+3));

matrix()内:

int matrix(int n, int m, num_t ***a, char* file)
{
  ...
  a[i][j]->s = d; //segfaults here

此处,当i变为1时,您正尝试访问下一个Matrix_t ,但您只传递指向单个的指针Matrix_t 即可。为了使这项工作,您必须在索引元素之前取消引用指针。例如:

  (*a)[i][j].s = d; //segfaults here

或者,更好的是:传递a而不是&a,并将您的函数定义更改为使用双指针而不是三指针。请注意,您还需要将->更改为.。可能还有其他必要的变化;我对你的代码看起来太过分了。

答案 2 :(得分:0)

你应该:

malloc(sizeof(num_t));

指针符号只能给你4个字节,因此存储器故障。