Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中结构内部指针数组的动态内存分配_C - Fatal编程技术网

C语言中结构内部指针数组的动态内存分配

C语言中结构内部指针数组的动态内存分配,c,C,我有一项学校作业,为《生活的游戏》写一些函数,我被困在一开始: 实现函数“createField”,为保存游戏场的“Field”结构以及参数“xsize”和“ysize”中给定的二维维度数组分配所需空间。字段中的每个单元格必须初始化为“死”状态,以及结构中的“xsize”和“ysize”字段 注意:测试假设字段的行(y轴)是数组的第一个维度(并且是首先分配的),列是第二个维度。即,单元索引为[y][x] 您还需要实现函数“releaseField”,释放createField()分配的内存。测试

我有一项学校作业,为《生活的游戏》写一些函数,我被困在一开始:

实现函数“createField”,为保存游戏场的“Field”结构以及参数“xsize”和“ysize”中给定的二维维度数组分配所需空间。字段中的每个单元格必须初始化为“死”状态,以及结构中的“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;   
}
请帮帮我,我花了这么多时间在搜索,但我无法集中精力

PS:除了函数的内容,我不能修改任何内容。

您没有做这部分。字段中的每个单元格必须初始化为“死”状态,以及结构中的“xsize”和“ysize”字段

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


其他评论。您应该检查以确保
malloc
没有返回
NULL
。如果是这样,则表示内存不足,希望处理错误,而不是出现分段错误

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

您没有执行此部分。字段中的每个单元格必须初始化为“死”状态,以及结构中的“xsize”和“ysize”字段

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


其他评论。您应该检查以确保
malloc
没有返回
NULL
。如果是这样,则表示内存不足,希望处理错误,而不是出现分段错误

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

分配说明“字段中的每个单元格必须初始化为“死”状态”。你没有那样做。这意味着当其他代码访问某个单元格时,它正在读取一个垃圾值

分配行后,需要循环并将每个单元格设置为死。像这样的方法应该会奏效:

create->cells[j] = malloc(xsize*sizeof(State)); // Your existing line
for(unsigned int i=0;i<xsize;i++)
  create->cells[j][i] = DEAD;
create->cells[j]=malloc(xsize*sizeof(State));//你现有的线路
for(unsigned int i=0;icells[j][i]=DEAD;
分配说明“字段中的每个单元格必须初始化为“死”状态”。您没有这样做。这意味着当其他代码访问某个单元格时,它正在读取垃圾值

分配行后,需要循环并将每个单元格设置为死单元格。类似的操作应该可以:

create->cells[j] = malloc(xsize*sizeof(State)); // Your existing line
for(unsigned int i=0;i<xsize;i++)
  create->cells[j][i] = DEAD;
create->cells[j]=malloc(xsize*sizeof(State));//您的现有行
for(unsigned int i=0;icells[j][i]=DEAD;

逐字逐句地发布错误。我怀疑此代码被标识为内存泄漏的分配点,因为您从未正确地清除其他位置的所有这些分配。除了无用的
(void)xsize;
(void)ysize;
,此特定代码唯一的其他错误是无法验证您的分配是否成功。并且使用
状态*
状态
而不是
int*
int
,并且可能两者都不会导致上述但未列出的“valgrind错误”。(顺便说一句,运行valgrind的道具;比大多数人付出的努力多得多)。
(无效)xsize;
这是什么?@PatrickCollins应该关闭未使用变量的编译器警告。它可以安全地删除。@FDinoff为什么有人要这样做?@PatrickCollins很可能是在模板代码中给出的,这样它就可以在没有警告的情况下编译。我用它来忽略函数需要执行时的参数有参数(比如函数指针),但我没有额外的数据要传递给函数。发布错误。逐字逐句,并在问题中。我怀疑此代码被标识为内存泄漏的分配点,因为您从未正确清理其他位置的所有这些分配。除了无用的
(void)xsize;
(void)ysize;
,此特定代码的唯一错误是未能成功验证您的分配。使用
状态*
状态
而不是
int*
int
,这两种情况都可能不会导致上述但未列出的“valgrind错误”。(顺便说一句,运行valgrind的道具;比大多数人付出的努力多得多)。
(无效)xsize;
这是什么?@PatrickCollins应该关闭未使用变量的编译器警告。它可以安全地删除。@FDinoff为什么有人要这样做?@PatrickCollins很可能是在模板代码中给出的,这样它就可以在没有警告的情况下编译。我用它来忽略函数需要执行时的参数有参数(比如说函数指针),但我没有额外的数据传递给函数。非常感谢大家,这非常有用!我怎么能投票给你或其他人???@KhaledAbdallah你需要15个声誉
create->cells[j] = malloc(xsize*sizeof(State)); // Your existing line
for(unsigned int i=0;i<xsize;i++)
  create->cells[j][i] = DEAD;