有关于野指针及其他c++问题小结(一)

1.野指针

野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。
本次题目中有关野指针的问题使我debug了很久。
题目如下,完整文件后面会提。
学习如何用C模仿C++的类:
How do you implement a class in C?
根据给出的文件实现C中的“Date class”。
问题中写好两个文件,来要求实现第三个文件。

//file 1
#include "date.h"
#include <stdio.h>
#include <assert.h>

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。注意使用这里通过使用指针的指针来避免野指针问题。

2.有关this

不知道为什么,学校oj上需要在member function 中用private data member时硬是要用this。平时就记住了吧。

这星期没有很多难的知识点,以后博客的篇幅会增加的。loading
以后每周都会更新,学校oj上的题目,有意者自取。地址:
http://download.csdn.net/detail/ralphfjy/9763266

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值