指向函数中结构数组的指针

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]