gpt4 book ai didi

c - 二维数组结构段错误

转载 作者:行者123 更新时间:2023-11-30 17:30:15 25 4
gpt4 key购买 nike

我正确地分配了我的结构吗?如果是这样,那么为什么在第一个元素之后会发生段错误。我对整个指针和结构体的取消引用感到非常困惑。

问题:

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

    5 4 3 2 1 1
    11 21 1 3 2 2

相关代码:

结构体

typedef struct num{
int s;
}num_t;

在使用 a 的 main 中(注意 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));

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

 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

编辑2:

抱歉,我发布了来自 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;
}

主要内容:

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

结论

二维结构数组与二维整数数组不同。不要在此类函数内传递结构体的地址。

最佳答案

而不是

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

这样的代码就可以工作。

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

关于c - 二维数组结构段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25210527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com