我有一个学校的任务,为生活游戏写一些功能,我一开始就被卡住了:
实现函数'createField',为包含游戏字段的'Field'结构分配所需的空间,并为参数'xsize'和'ysize'中给出的二维维数组分配。必须将字段中的每个单元格初始化为“DEAD”状态,以及结构中的“xsize”和“ysize”字段。
注意:测试假设字段的行(y轴)是数组的第一个维度(并且首先分配),而列是第二个维度。即,细胞被索引为[y] [x]。
您还需要实现函数'releaseField',以释放createField()分配的内存。测试将对所有内存版本使用此函数,因此未能实现此操作将导致Valgrind关于内存泄漏的错误
typedef enum {
DEAD,
ALIVE
} State;
typedef struct {
unsigned int xsize, ysize;
State **cells;
} Field;
第一项任务是编写创建字段并释放它的函数
Field *createField(unsigned int xsize, unsigned int ysize)
{
(void) xsize;
(void) ysize;
Field *create = malloc(sizeof( Field));
create->xsize=xsize;
create->ysize=ysize;
// for this part I don't know the syntax + I don understand what I am doing
create->cells = malloc (ysize*sizeof(State*));
for(unsigned int j=0;j<ysize;j++)
{
create->cells[j] = malloc(xsize*sizeof(State));
}
return create;
}
我的清理功能:
void releaseField(Field *f)
{
(void) f;
for(unsigned int i=0;i<f->ysize;i++)
free(f->cells[i]);
free(f->cells);
free (f);
}
我收到了valgrind错误:
==374== Conditional jump or move depends on uninitialised value(s)
==374== at 0x40172C: test_createField (test_source.c:26)
==374== by 0x4058A0: srunner_run_all (in /tmc/test/test)
==374== by 0x402276: tmc_run_tests (tmc-check.c:122)
==374== by 0x401F2F: main (test_source.c:225)
==374== Uninitialised value was created by a heap allocation
==374== at 0x4C244E8: malloc (vg_replace_malloc.c:236)
==374== by 0x402960: createField (gameoflife.c:21)
==374== by 0x401662: test_createField (test_source.c:16)
==374== by 0x4058A0: srunner_run_all (in /tmc/test/test)
==374== by 0x402276: tmc_run_tests (tmc-check.c:122)
==374== by 0x401F2F: main (test_source.c:225)
==374==
==375== Conditional jump or move depends on uninitialised value(s)
==375== at 0x4017F5: countlive (test_source.c:42)
==375== by 0x401921: test_initField (test_source.c:62)
==375== by 0x4058A0: srunner_run_all (in /tmc/test/test)
==375== by 0x402276: tmc_run_tests (tmc-check.c:122)
==375== by 0x401F2F: main (test_source.c:225)
==375== Uninitialised value was created by a heap allocation
==375== at 0x4C244E8: malloc (vg_replace_malloc.c:236)
==375== by 0x402960: createField (gameoflife.c:21)
==375== by 0x4018F3: test_initField (test_source.c:57)
==375== by 0x4058A0: srunner_run_all (in /tmc/test/test)
==375== by 0x402276: tmc_run_tests (tmc-check.c:122)
==375== by 0x401F2F: main (test_source.c:225)
==375==
==375== Conditional jump or move depends on uninitialised value(s)
==375== at 0x401820: countlive (test_source.c:44)
==375== by 0x401921: test_initField (test_source.c:62)
==375== by 0x4058A0: srunner_run_all (in /tmc/test/test)
==375== by 0x402276: tmc_run_tests (tmc-check.c:122)
==375== by 0x401F2F: main (test_source.c:225)
==375== Uninitialised value was created by a heap allocation
==375== at 0x4C244E8: malloc (vg_replace_malloc.c:236)
==375== by 0x402960: createField (gameoflife.c:21)
==375== by 0x4018F3: test_initField (test_source.c:57)
==375== by 0x4058A0: srunner_run_all (in /tmc/test/test)
==375== by 0x402276: tmc_run_tests (tmc-check.c:122)
==375== by 0x401F2F: main (test_source.c:225)
==375==
请帮助我,我花了这么多时间搜索,但无法绕过它。
PS:我不能修改除函数内容之外的任何内容..
答案 0 :(得分:3)
你没有做这部分。 “该字段中的每个单元格必须初始化为'DEAD'状态,以及结构中的'xsize'和'ysize'字段。”
malloc返回的数据未初始化。所以它可以被设置为任何东西(它不会默认为DEAD。)所以你需要将二维数组中的所有内容初始化为DEAD。
其他评论。您应该检查以确保malloc
没有返回NULL
。如果是这样,则意味着内存不足并希望处理错误而不是出现分段错误。
此外,您可以安全地删除(void) var;
语句,因为它们可以使有关未使用变量的警告静音。但是,您目前正在使用它们,它们没有用处。
答案 1 :(得分:2)
作业说“场中的每个单元必须初始化为'DEAD'状态”。你不是那样做的。这意味着当其他一些代码访问一个单元格时,它正在读取一个垃圾值。
分配行后,需要循环并将每个单元格设置为DEAD。这样的事情应该有效:
create->cells[j] = malloc(xsize*sizeof(State)); // Your existing line
for(unsigned int i=0;i<xsize;i++)
create->cells[j][i] = DEAD;