gpt4 book ai didi

c - C中结构内指针数组的动态内存分配

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:46 27 4
gpt4 key购买 nike

我的学校作业是为生活游戏编写一些功能,但我一开始就卡住了:

实现函数“createField”,为保存游戏字段的“Field”结构分配所需的空间,并为参数“xsize”和“ysize”中给出的二维数组分配所需的空间。字段中的每个单元格以及结构中的“xsize”和“ysize”字段都必须初始化为“DEAD”状态。

注意:测试假定字段的行(y 轴)是数组的第一维(首先分配),列是第二维。即,单元格索引为 [y][x]。

您还需要实现释放由 createField() 分配的内存的函数“releaseField”。测试将对所有内存释放使用此功能,因此未能实现此功能将导致有关内存泄漏的 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:除了函数的内容,我不能修改任何东西..

最佳答案

这部分你没有做。 “该字段中的每个单元格以及结构中的‘xsize’和‘ysize’字段都必须初始化为‘DEAD’状态。”

从 malloc 返回的数据是未初始化的。因此它可以设置为任何值(它不会默认为 DEAD。)因此您需要将二维数组中的所有内容初始化为 DEAD。


其他评论。您应该检查以确保 malloc 不会返回 NULL。如果是这样,则意味着您用完了内存并且想要处理错误而不是出现段错误。

您还可以安全地删除 (void) var; 语句,因为它们在那里可以消除有关未使用变量的警告。但是,您目前正在使用它们,但它们没有任何用处。

关于c - C中结构内指针数组的动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29068082/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com