C 二维阵列结构分段故障

C 二维阵列结构分段故障,c,arrays,struct,malloc,C,Arrays,Struct,Malloc,我是否正确地修改了结构?如果是,那么为什么在第一个元素之后会发生segfault。我对整个指针和取消对结构的引用感到非常困惑 问题是: 结构a的2x2矩阵 包含行的文件fp 5 4 3 2 1 1 11 21 1 3 2 2 相关代码: 结构 typedef struct num{ int s; }num_t; 主要使用注释的n和m是int,在我的运行时中是:n=2,m=3 num_t **a; a = malloc(sizeof(num_t *) * n); for(i=0;

我是否正确地修改了结构?如果是,那么为什么在第一个元素之后会发生segfault。我对整个指针和取消对结构的引用感到非常困惑

问题是:

结构a的2x2矩阵 包含行的文件fp

5 4 3 2 1 1
11 21 1 3 2 2
相关代码:

结构

typedef struct num{
      int s;
}num_t;
主要使用注释的n和m是int,在我的运行时中是: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));
编辑2:

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

编辑3:

格式与成品

#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;
}
结论

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

而不是

a[i][j]->s = s
这样的代码可以工作

 p = a[i];
 p[j].s = s;
当你调用matrix时,你传递了a的地址。如果将num\u t**视为矩阵类型,则传递一个指向矩阵的指针

和内部矩阵:

这里,当我变为1时,您试图访问下一个矩阵,但您只传递了一个指向单个矩阵的指针。为了实现这一点,必须在索引元素之前取消对指针的引用。例如:

  (*a)[i][j].s = d; //segfaults here
或者,更好的方法是:传递a而不是&a,并将函数定义更改为使用双指针而不是三指针。请注意,您还需要将->更改为。可能有其他必要的变更;我没有深入研究您的代码。

您应该:

malloc(sizeof(num_t));

指针符号只给您4个字节,因此内存有问题。

请正确缩进代码,并发布一个自包含的编译示例。您发布的结构甚至没有t字段,并且您没有向我们显示什么是complexnum\u t。这个问题是无法回答的。在检查失败的malloc之前取消引用a-应该在使用a之前进行检查。此外,不需要把A和A转换成矩阵,它应该使用NUMYT**AIFP=NULL {FLUCTFEP;:移除FROSEFEP;请考虑扩展这个答案。version@Nish我不明白,你是说a[I][j]->s=d?另外,p来自哪里/在完成的代码中如何初始化它。
 p = a[i];
 p[j].s = s;
num_t **a;
...
pb = matrix(n,m,&a,*(argv+3));
int matrix(int n, int m, num_t ***a, char* file)
{
  ...
  a[i][j]->s = d; //segfaults here
  (*a)[i][j].s = d; //segfaults here
malloc(sizeof(num_t));