C结构会这样吗?

时间:2013-02-28 15:45:26

标签: c struct typedef

使用fwrite,我正在编写整个结构? w.e在f1和f2?任何帮助将不胜感激

typedef struct {
    int field1;
    int field2;
}mystruct;

int main(int argc,char *argv[])
{

    int size=2;
    mystruct structarray [size];
    int i=0;
    for (i=0;i<size;i++)
    {
        structarray[i]=calloc(1,sizeof(mystruct));
    }

    FILE *F1;
    if (fopen("structfile","wt")==NULL){
        err_sys("cannot be opened");
    }

     i=0;
    for (i=0;i<size;i++)
    {
        structarray[i].field1=i;
    }

    fwrite(structarray[0].field1,sizeof(mystruct),size,F1);
    fclose(F1);
}

2 个答案:

答案 0 :(得分:1)

从概念上讲,您的方法是有效的。但是,您的代码存在一些问题:

(1)structarray被声明为自动变量(在堆栈上分配)。没有理由为每个数组元素调用calloc();数组已经完全分配。也许你打算初始化数组元素(例如,memset()等)。

(2)fopen()返回指向已打开文件的指针,但您没有将返回值赋给F1。因此,F1仍然未初始化,因此对fwrite()的调用无效。

(3)如果您打算将完整的结构数组保存到文件中(而不是特定元素),请将调用更改为fwrite(),如下所示:

fwrite(structarray, sizeof(mystruct), size, F1);

(4)始终检查fwrite()的返回值,确保其成功。

答案 1 :(得分:1)

structarray[0].field1int,但fwrite的第一个参数是void*。使用

fwrite(structarray, sizeof(mystruct), size, F1);

或者,我更喜欢

fwrite(structarray, sizeof *structarray, size, F1);

因为它没有与structarray的类型耦合,减少耦合是一件好事。你甚至可以做到

fwrite(structarray, sizeof structarray, 1, F1);

只要structarray确实是一个数组而不是指针。

您应该检查fwrite的返回值。并在警告级别设置为高的情况下编译...编译器应警告您尝试将int传递给fwrite,以及

structarray[i]=calloc(1,sizeof(mystruct));

不合法... structarray[i]mystructcalloc返回指针。根据您的问题,请参阅aardvarkk的评论。它还应该告诉你,你没有设置它就使用了F1。