将值赋给结构的指针

时间:2018-06-13 17:38:30

标签: c

我尝试为my_record分配值,但编译器一直指示我的行my_record->x = counter;出错:

  

未初始化的本地变量' my_record'使用

#include<stdio.h>

typedef struct rec
{
    int x, y, z;
} *abc;

int main()
{
    int counter;
    FILE *ptr_myfile;
    //struct rec my_record;
    abc my_record;

    ptr_myfile = fopen("test.bin", "wb");
    if (!ptr_myfile)
    {
        printf("Unable to open file!");
        return 1;
    }
    for (counter = 1; counter <= 10; counter++)
    {
        my_record->x = counter;
        fwrite(&my_record, sizeof(abc), 1, ptr_myfile);
    }
    fclose(ptr_myfile);
    system("pause");
    system("pause");
    return 0;
}

3 个答案:

答案 0 :(得分:3)

你有几个问题。

首先,您没有为my_record分配内存指向。关于使用未初始化变量的警告是因为你没有这样做:

abc my_record = malloc(sizeof(struct rec));

其次,fwrite()的第一个参数应该是指向要编写的结构的指针,但是你正在使用指向指针的指针。

第三,fwrite()的第二个参数应该是结构的大小,但是你给出了指针的大小。

似乎没有任何充分的理由将abc首先定义为指针。您应该声明一个包含结构本身的变量。

#include<stdio.h>

typedef struct rec
{
    int x, y, z;
} abc;

int main()
{
    int counter;
    FILE *ptr_myfile;
    //struct rec my_record;
    abc my_record;

    ptr_myfile = fopen("test.bin", "wb");
    if (!ptr_myfile)
    {
        printf("Unable to open file!");
        return 1;
    }
    for (counter = 1; counter <= 10; counter++)
    {
        my_record.x = counter;
        fwrite(&my_record, sizeof my_record, 1, ptr_myfile);
    }
    fclose(ptr_myfile);
    system("pause");
    return 0;
}

答案 1 :(得分:3)

您的代码中存在几个问题,例如

  • 在此abc my_record; abcstruct rec*,编译器正在抱怨my_record未初始化。看起来像是

    struct rec *my_record; /* un-initilized struct ptr */

    首先为它分配内存,如

    abc my_record = malloc(sizeof(struct rec));

  • fwrite(&my_record, sizeof(abc), 1, ptr_myfile);中,第二个参数sizeof(abc)是错误的,因为abc是结构指针,它不会产生正确的结果。另外,fwrite()的第一个论点是错误的,因为它应该指向结构my_record而不是&my_record

    fwrite(my_record, sizeof(struct rec), 1, ptr_myfile);

此外,您还希望看到Is it a good idea to typedef pointers?阅读此链接后,您可能希望避免typedef指针,就像您在代码中所做的那样。你想要像下面这样做

typedef struct rec {
    int x, y, z;
}abc;
int main(void) {
    int counter;
    FILE *ptr_myfile;
    abc *my_record = malloc(sizeof(struct rec));
    ptr_myfile = fopen("test.bin", "wb");
    if (!ptr_myfile) {
        printf("Unable to open file!");
        return 1;
    }
    for (counter = 1; counter <= 10; counter++) {
        my_record->x = counter;
        fwrite(my_record, sizeof(abc), 1, ptr_myfile);
    }
    fclose(ptr_myfile);
    return 0;
}

答案 2 :(得分:1)

试试这个:

// Include this
#include <stdlib.h>

typedef struct rec {
    int x, y, z;
} abc;

int main() {
    ...

    abc *my_record = (abc*) malloc( sizeof(abc) );

    ...
}