指向函数中结构数组的指针
Pointer to array of struct in function
我的指针有问题。我想读取一个带有函数的二进制文件,然后在 main 中使用读取的数据。问题是我必须传递一个指向结构数组的指针才能使用 main 中的数据。
密码是:
#define TMOLDEO 8
#define TAM 41
struct fichpiezas{
int codPieza;
float dimPieza;
float costePieza[TMOLDEO];
};
int leer_fichero(struct fichpiezas *vpiezas[]);
int main(int argc, const char * argv[]) {
struct fichpiezas vpiezas[TAM];
leer_fichero(&vpiezas);
for(int i = 0; sizeof(vpiezas)/sizeof(struct fichpiezas); i++){
printf("Codigo pieza : %d\n", vpiezas[i].codPieza);
}
return 0;
}
int leer_fichero (struct fichpiezas *vpiezas[]){
FILE *fich;
struct fichpiezas pieza;
int error_dev = 0, i = 0;
if ((fich = fopen("piezas.bin", "rb")) == NULL){
printf ( "Error en apertura del fichero para lectura \n " );
error_dev = 1;
} else{
//Bucle mientras no sea fin de fichero
while (! feof(fich)){
fread (&pieza, sizeof(pieza), 1, fich);
vpiezas[i] = &pieza;
i++;
}
fclose (fich);
}
return error_dev;
}
只需更改此
int leer_fichero (struct fichpiezas *vpiezas[])
至
int leer_fichero (struct fichpiezas *vpiezas)
在你的 main()
leer_fichero(&vpiezas);
至
leer_fichero(vpiezas);
传递给函数时,数组会自动衰减为指针。所以你不需要将它的地址传递给函数。
你还有一个问题,这个作业
vpiezas[i] = &pieza;
是个问题,因为你在数组中存储的是局部变量pieza
的地址,而这个函数returns.
的时候数据就没有了
此外,pieza
的值在每次迭代中被覆盖 fread()
并且由于您存储 pieza
的地址而不是它的值,因此数组的所有元素都将如果以这种方式成功,则具有相同的值。
你需要将结构复制到数组元素中,如果你按照我上面的建议,这一行应该改为
vpiezas[i] = pieza;
否则程序会编译失败,因为&pieza
的类型是struct fichpiezas *
,而vpiezas[i]
的类型在改变函数原型后现在是struct fichpiezas
。
此外,关于 while (! feof(fich))
有一个 answer 详细解释了为什么这是错误的。
还有一件事,添加一个检查i < TAM
,否则你有溢出数组的风险。
这个
int leer_fichero(struct fichpiezas * vpiezas[]);
将 vpiezas
定义为指向 struct fichpiezas
的指针,如
int leer_fichero(struct fichpiezas * vpiezas[]);
相当于
int leer_fichero(struct fichpiezas ** vpiezas);
通过执行
来寻址您传递的数组的元素
leer_fichero(&vpiezas);
这样做
(*vpiezas)[index]
在 leer_fichero()
内。
定义
会更直接
int leer_fichero(struct fichpiezas * vpiezas);
并通过
leer_fichero(vpiezas);
然后你可以像你一样处理这些元素:
vpiezas[index]
我的指针有问题。我想读取一个带有函数的二进制文件,然后在 main 中使用读取的数据。问题是我必须传递一个指向结构数组的指针才能使用 main 中的数据。
密码是:
#define TMOLDEO 8
#define TAM 41
struct fichpiezas{
int codPieza;
float dimPieza;
float costePieza[TMOLDEO];
};
int leer_fichero(struct fichpiezas *vpiezas[]);
int main(int argc, const char * argv[]) {
struct fichpiezas vpiezas[TAM];
leer_fichero(&vpiezas);
for(int i = 0; sizeof(vpiezas)/sizeof(struct fichpiezas); i++){
printf("Codigo pieza : %d\n", vpiezas[i].codPieza);
}
return 0;
}
int leer_fichero (struct fichpiezas *vpiezas[]){
FILE *fich;
struct fichpiezas pieza;
int error_dev = 0, i = 0;
if ((fich = fopen("piezas.bin", "rb")) == NULL){
printf ( "Error en apertura del fichero para lectura \n " );
error_dev = 1;
} else{
//Bucle mientras no sea fin de fichero
while (! feof(fich)){
fread (&pieza, sizeof(pieza), 1, fich);
vpiezas[i] = &pieza;
i++;
}
fclose (fich);
}
return error_dev;
}
只需更改此
int leer_fichero (struct fichpiezas *vpiezas[])
至
int leer_fichero (struct fichpiezas *vpiezas)
在你的 main()
leer_fichero(&vpiezas);
至
leer_fichero(vpiezas);
传递给函数时,数组会自动衰减为指针。所以你不需要将它的地址传递给函数。
你还有一个问题,这个作业
vpiezas[i] = &pieza;
是个问题,因为你在数组中存储的是局部变量pieza
的地址,而这个函数returns.
此外,pieza
的值在每次迭代中被覆盖 fread()
并且由于您存储 pieza
的地址而不是它的值,因此数组的所有元素都将如果以这种方式成功,则具有相同的值。
你需要将结构复制到数组元素中,如果你按照我上面的建议,这一行应该改为
vpiezas[i] = pieza;
否则程序会编译失败,因为&pieza
的类型是struct fichpiezas *
,而vpiezas[i]
的类型在改变函数原型后现在是struct fichpiezas
。
此外,关于 while (! feof(fich))
有一个 answer 详细解释了为什么这是错误的。
还有一件事,添加一个检查i < TAM
,否则你有溢出数组的风险。
这个
int leer_fichero(struct fichpiezas * vpiezas[]);
将 vpiezas
定义为指向 struct fichpiezas
的指针,如
int leer_fichero(struct fichpiezas * vpiezas[]);
相当于
int leer_fichero(struct fichpiezas ** vpiezas);
通过执行
来寻址您传递的数组的元素leer_fichero(&vpiezas);
这样做
(*vpiezas)[index]
在 leer_fichero()
内。
定义
会更直接int leer_fichero(struct fichpiezas * vpiezas);
并通过
leer_fichero(vpiezas);
然后你可以像你一样处理这些元素:
vpiezas[index]