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

时间:2015-01-16 19:50:01

标签: c arrays pointers struct

我的指针有问题。我想读一个带有函数的二进制文件,然后使用main中的读取数据。问题是我必须传递一个指向struct数组的指针才能使用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;
}

2 个答案:

答案 0 :(得分:4)

只需更改此

int leer_fichero (struct fichpiezas *vpiezas[])

int leer_fichero (struct fichpiezas *vpiezas)

并在main()

leer_fichero(&vpiezas);

leer_fichero(vpiezas);

当传递给函数时,数组将自动衰减为指针。所以你不需要将它的地址传递给函数。

您还有另一个问题,即此作业

vpiezas[i] = &pieza;

是一个问题,因为您在数组中存储了局部变量pieza的地址,并且当此函数返回时数据将消失。

另外,pieza的值在每次迭代bu fread()中都会被覆盖,因为您存储pieza的地址而不是它的值,所有元素都是如果以这种方式成功,数组将具有相同的值。

你需要将结构复制到数组元素中,如果你遵循我的建议,这一行应改为

vpiezas[i] = pieza;

或程序将无法编译,因为在更改函数原型后,&pieza的类型为struct fichpiezas *vpiezas[i]的类型现为struct fichpiezas

此外,大约while (! feof(fich))还有一个answer,详细解释了为什么这是错误的。

还有一件事,添加一个支票i < TAM,因为否则你有可能会溢出数组。

Nota :Espero ser de ayuda。

答案 1 :(得分:3)

这个

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]