C 中的 ADT(使用头文件、源文件和主文件)

ADT (using a header file, source file and main file) in C

我正在尝试使用需要 2 个日期的结构创建一个简单的 ADT。然后returns一个年龄。它必须使用一个头文件,一个头文件的源文件,一个主文件。

这是我运行的程序,没有任何反应。有人可以告诉我我做错了什么吗?

age.h

#ifndef AGE_H_

#define AGE_H_

typedef struct getage * Age;

#define MAX  5

Age get_Age(int birthYear, int yearNow);

void age_Destroy(Age a);


#endif

age.c

#include <stdio.h>

#include "age.h"


struct getage {

       int birthYear;

       int yearNow;

};

Age a[1];

Age get_Age(int birthYear, int yearNow){

             int giveAge = 0;

             giveAge = a[0]->yearNow - a[0]->birthYear;

             printf("%d",giveAge);

             return 0;

            }

void age_Destroy(Age a){

                     free(a);

     }

main.c

#include <windows.h>

#include <stdio.h>

#include "age.h"


void age_print(Age a);

void age_print(Age a){

        printf("%d\n", &a);

}



int main() {

    Age a;

    get_Age(1986, 2020);
    
    age_print(a);

    printf("%d\n", &a);

    system("pause");

    //age_Destroy(a);
    
    
}

错误:

  • 在函数get_Age中:
    • 不是分配结构,而是取消引用 a[0](全局变量,初始化为 NULL)。
    • 0(转换为 NULL)是 returned 而不是 returning 年龄。
  • 在函数age_Destroy中:
    • free() 在没有声明的情况下使用,也不包含适当的 header。
  • 在函数age_print中:
    • 错误类型的数据被传递给 printf()%d 请求 intAge* 被传递。
  • 在函数main中:
    • get_Age 的 return 值被删除。
    • 错误类型的数据被传递给 printf()%d 请求 intAge* 被传递。

修复了不会导致分段错误或未定义行为的代码:

age.h(未更改)

#ifndef AGE_H_

#define AGE_H_

typedef struct getage * Age;

#define MAX  5

Age get_Age(int birthYear, int yearNow);

void age_Destroy(Age a);

#endif

age.c

#include <stdio.h>

#include <stdlib.h> // for malloc() and free()

#include "age.h"


struct getage {

       int birthYear;

       int yearNow;

};

Age get_Age(int birthYear, int yearNow){

        Age a = malloc(sizeof(*a)); // allocate a structure

        if (a == NULL) { perror("malloc"); exit(1); }

        a->yearNow = yearNow; // assign data

        a->birthYear = birthYear;

        int giveAge = 0;

        giveAge = a->yearNow - a->birthYear;

        printf("%d",giveAge);

        return a; // return pointer to the allocated structure

}

void age_Destroy(Age a){

        free(a);

}

main.c

#include <stdlib.h> // more portable header for system()

#include <stdio.h>

#include "age.h"


void age_print(Age a);

void age_print(Age a){

        printf("%p\n", (void*)a); // use valid combination of format and data

}



int main() {

    Age a;

    a = get_Age(1986, 2020); // assign the return value
    
    age_print(a);

    printf("%p\n", (void*)a); // use valid combination of format and data

    system("pause");

    age_Destroy(a); // enable freeing
    
    
}

(有些行为可能看起来很奇怪,但我相信这是有效的,因为描述的不是期望的行为。)