如何访问其原始函数之外的结构成员?

时间:2015-08-31 07:11:22

标签: c pointers struct

我正在开发一个项目,我在一个单独的函数中创建结构而不是main()。在创建并将成员(变量)信息添加到结构变量之后,我需要能够return指向我可以访问它以供参考和打印的结构的指针。

我包含了我的代码,请尽可能简单,因为我是结构新手。

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

typedef struct _car
{
    char color[20];
    char model[20];
    char brand[20];
    int year;
    struct _car *eptr;
} Car;

Car* readCars(char* filename);


/*
 * 
 */
int main(int argc, char** argv) {
    Car *Cars;
    Car *eptr;

    Cars = readCars(argv[1]);

    printf("%s%s%s%s", Cars->color, Cars->brand, Cars->model, Cars->color);

    return (EXIT_SUCCESS);
}

Car* readCars(char* filename)
{
    FILE *file = fopen(filename, "r");
    int year;
    char color [20], model [20], brandx[20];
    Car car1;
    Car car2;
    Car *carptr;
    Car *car2ptr;
    if (file == NULL)
    {
        printf("File cannot be opened\n");
    }
    while(file != EOF)
    {

        fscanf(file, "%s%s%s%d", color, model, brandx, &year);

        strcpy(car1.color, color);
        strcpy(car1.model, model);
        strcpy(car1.brand, brandx);
        car1.year = year;

        carptr = &car1;
        fscanf(file, "%s%s%s%d", color, model, brandx, &year);

        strcpy(car2.color, color);
        strcpy(car2.model, model);
        strcpy(car2.brand, brandx);
        car2.year = year;
        car2ptr = &car2;

        if (fscanf(file, "%s%s%s%d", color, model, brandx, &year) == EOF)
        {
            break;
        }
    }

    return carptr;    
    }

1 个答案:

答案 0 :(得分:6)

要回答帖子中的主要问题,在Car* readCars(char* filename)函数中,您将局部变量的地址存储到指针中

carptr = &car1;

然后尝试return

return carptr;

在这种情况下,只要readCars()函数完成执行,car的存在就会停止,你将通过访问返回的指针来调用undefined behaviour

如果您希望内存在其分配范围之外有效(在本例中,在readCars()函数之外),则需要使用动态内存分配来分配内存,例如{{3}和家人。

FWIW,一旦你完成了使用返回的指针,你还需要malloc()内存以避免free()

那就是说,

  1. 您永远不会有效地检查fopen()fscanf()的成功。如果其中任何一个失败,则继续正常是调用UB的理想方案。
  2. memory leak
  3. 代码中的指针算法无意义
  4. 你有语法错误......还有更多。