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
请求 int
但 Age*
被传递。
- 在函数
main
中:
get_Age
的 return 值被删除。
- 错误类型的数据被传递给
printf()
:%d
请求 int
但 Age*
被传递。
修复了不会导致分段错误或未定义行为的代码:
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
}
(有些行为可能看起来很奇怪,但我相信这是有效的,因为描述的不是期望的行为。)
我正在尝试使用需要 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
请求int
但Age*
被传递。
- 错误类型的数据被传递给
- 在函数
main
中:get_Age
的 return 值被删除。- 错误类型的数据被传递给
printf()
:%d
请求int
但Age*
被传递。
修复了不会导致分段错误或未定义行为的代码:
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
}
(有些行为可能看起来很奇怪,但我相信这是有效的,因为描述的不是期望的行为。)