CS61c Spring2022 Project1

CS61C Spring2022 Project1 Guide

1. task1

task1给的row 和 column 是从0开始的,不需要再-1

2. 二维数组两种表示

1
char **board

首先在C 里面,

1
char * ptr

可以表示:

  • 字符串
1
ptr = "abc"
  • 字符数组

那么,**char board 可以看出一个字符指针型数组,数组中的每个元素都是 *char, 每个 *char又可以指向一个一维字符数组, 因此

1
**char

相当于二维字符数组

其二是

1
char *arr[]

是一个*char 型数组,arr数组里面的元素都是 *char类型


3. 注意如何为二维pointer to pointer to char数组board分配malloc的空间

allocate-space

对于二维数组,不能直接执行:

1
board = (char**)malloc(sizeof(char)*size_t)

而是要一步一步的,先把它当成一维指针型数组,为其分配一维数组的空间:

1
board = (char**)malloc(sizeof(char*)*size_t1)

然后再为该指针数组里面的每个元素分配空间,每个元素都指向一个新的char 数组:

1
2
3
for (int i = 0; i < size_t1; i++) {
board[i] = (char*)malloc(sizeof(char)*size_t2);
}

4. task2

task2 注意二维数组,每个元素都是一维数组,要分别free每个元素,否则 会造成内存泄漏:

5. segmentation fault的原因

  • 数组越界
  • 访问不存在的内存空间(未分配)

6.踩坑点

这里比较坑的一点是

  1. row 是相当于y坐标,column相当于横坐标,对于board[ ][ ]二维数组,访问写成board[y][x] 而不是board [x][y]

  2. 如果蛇死了,立即将头替换为’x’即可

7. task 5

文件输入流,太难了,文件没学好,实际上就是让你从文件中将 长方形board二维数组 读入

game->board,并设置好x_size和y_size,然后返回*game

这一步我使用的是 fgets() ,由于你不知道文件里面的长方形矩阵有多少个字符,也不知道board数组有多少行,无法用malloc精确开辟空间,但是这里fgets又需要你传入特定大小作为参数,况且如果不事先开辟board的空间如何使用board $[i][j] $ ? 因此此处使用一个固定大小的缓存buffer数组,和向fgets()传入一个固定大小参数

1
char *fgets(char *str, int n, FILE *stream)
参数
  • str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
  • n – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

同时可打印buffer数组核对是否读入成功

1
printf("%s",buffer);

8. task 7 关于函数指针 pointer to function 的传参

参见 https://www.geeksforgeeks.org/function-pointer-in-c/

1
update_state(state, &deterministic_food);
1
void update_state(game_state_t *state, int (*add_food)(game_state_t *state))

成功完成所有本地测试:


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!