野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。
本次题目中有关野指针的问题使我debug了很久。
题目如下,完整文件后面会提。
学习如何用C模仿C++的类:
How do you implement a class in C?
根据给出的文件实现C中的“Date class”。
问题中写好两个文件,来要求实现第三个文件。
//file 1
#include "date.h"
#include
#include
void TestDate(Date* date, int after, int before) {
printf("Year: %d\n", GetYear(date));
printf("Month: %d\n", GetMonth(date));
printf("Day: %d\n", GetDay(date));
char* date_string = GetDateString(date);
printf("Formatted: %s\n", date_string);
DestroyDateString(&date_string);
assert(date_string == NULL);
DestroyDateString(&date_string);
IncreaseDate(date);
date_string = GetDateString(date);
printf("1 day later: %s\n", date_string);
DestroyDateString(&date_string);
int i;
for (i = 0; i < after; ++i) {
IncreaseDate(date);
}
date_string = GetDateString(date);
printf("Another %d day(s) later: %s\n", after, date_string);
DestroyDateString(&date_string);
for (i = 0; i < before; ++i) {
DecreaseDate(date);
}
date_string = GetDateString(date);
printf("Another %d day(s) earlier: %s\n", before, date_string);
DestroyDateString(&date_string);
}
int main() {
int year, month, day;
int after, before;
scanf("%d%d%d%d%d", &year, &month, &day, &after, &before);
Date* date1 = CreateDate(year, month, day);
assert(sizeof(*date1) == sizeof(Date));
Date* date2 = CopyDate(date1);
assert(date1 != date2);
assert(date1->month == date2->month);
SetDate(date1, year + 1, month, day);
SetYear(date1, year);
SetMonth(date1, month);
SetDay(date1, day);
TestDate(date1, after, before);
DestroyDate(&date1);
DestroyDate(&date2);
assert(date1 == NULL);
DestroyDate(&date2);
return 0;
}
/*
One probable test case:
1900 2 28 365 366
Year: 1900
Month: 2
Day: 28
Formatted: 1900-02-28
1 day later: 1900-03-01
Another 365 day(s) later: 1901-03-01
Another 366 day(s) earlier: 1900-02-28
*/
//file 2
#ifndef DATE_H_
#define DATE_H_
typedef struct {
int year, month, day;
} Date;
Date* CreateDate(int year, int month, int day);
void DestroyDate(Date** p);
Date* CopyDate(const Date* date);
int GetYear(const Date* date);
int GetMonth(const Date* date);
int GetDay(const Date* date);
void SetYear(Date* date, int year);
void SetMonth(Date* date, int month);
void SetDay(Date* date, int day);
void SetDate(Date* date, int year, int month, int day);
char* GetDateString(const Date* date);
void DestroyDateString(char** p);
void IncreaseDate(Date* date);
void DecreaseDate(Date* date);
#endif
这里第三个文件自己写。
附上我的代码
`此处与2017。3。2前不开放“
//my solution
1。在free后,依然需要使用ptr = NULL;的语句。
2。在valgrind中,提示Leak_DefinitelyLost。
3。注意使用这里通过使用指针的指针来避免野指针问题。
不知道为什么,学校oj上需要在member function 中用private data member时硬是要用this。平时就记住了吧。
这星期没有很多难的知识点,以后博客的篇幅会增加的。loading
以后每周都会更新,学校oj上的题目,有意者自取。地址:
http://download.csdn.net/detail/ralphfjy/9763266