Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
如何使用自定义类型创建malloc()?_C_Arrays_Pointers_Multidimensional Array_Types - Fatal编程技术网

如何使用自定义类型创建malloc()?

如何使用自定义类型创建malloc()?,c,arrays,pointers,multidimensional-array,types,C,Arrays,Pointers,Multidimensional Array,Types,在头文件gameboard.h中,我有一个名为gameboard的结构。在此结构中,我声明square**squares,其中squares如下:typedef enum{EMPTY,RED\u COIN,YELLOW\u COIN}squares 在gameboard.c中,我有一个为2D数组分配内存的函数。在这个函数中,我声明gameboard*结果 问题:创建初始阵列时,即2D中存储阵列的部分,为什么我不能这样做: result->squares = malloc(numRows *

在头文件gameboard.h中,我有一个名为gameboard的结构。在此结构中,我声明
square**squares
,其中squares如下:
typedef enum{EMPTY,RED\u COIN,YELLOW\u COIN}squares

在gameboard.c中,我有一个为2D数组分配内存的函数。在这个函数中,我声明
gameboard*结果

问题:创建初始阵列时,即2D中存储阵列的部分,为什么我不能这样做:

result->squares = malloc(numRows * sizeof(result->square*));
更具体地说,为什么square是无效类型?

您不能“这样做”,因为您的
结果->square
子表达式无效<代码>结果->方块
将有效。普通的
square
也将有效。但是
result->square
毫无意义。在C中
->
是成员访问操作符。并且您的结构类型没有名为
square
的成员

  • 用于
    malloc
    的典型/惯用C代码如下所示

    some_pointer = malloc(n_elements * sizeof *some_pointer);
    
    将此应用到你的案例中,我们得到

    result->squares = malloc(numRows * sizeof *result->squares);
    
  • 如果您的
    result->square
    具有类型
    square**
    ,则适当的大小也可以用
    sizeof(array\u element\u type)
    表示为

    result->squares = malloc(numRows * sizeof(squares *));
    
    但是前者(类型不可知)的变体可以说比后者更好,特别是对于类型不可知。另见:


我完全不清楚您是如何达到
sizeof(result->square*)
的。您的变体看起来像是这两种变体的奇怪混合体,以不正确且无意义的方式编写。

此外,gameboard.squares被声明为一个squares指针数组。我不确定这是否是我的意图。@AnT:我的类目前正在研究指针和结构,显然我的知识还存在差距。在回顾了你的评论和我的问题之后,我发现在发布之前有很多错误。我的下一个问题是对int的2D数组使用malloc()和我的案例之间的区别。例如,我将对int执行此操作:somePtr=malloc(sizeof(int*)*numElements)。在处理结构时,为什么要使用正方形而不是它的类型(正方形)?@KC Wong:OP说最终目标是创建一个2D数组。假设它们采用典型的“锯齿数组”方法,看到声明为“指向指针的指针”的
正方形就一点也不奇怪了。@darylnak:
sizeof
有两种形式:可以在
sizeof
下使用类型名称,也可以在
sizeof
下使用表达式。我上面的回答在
malloc
的上下文中显示了这两种变体。这两种变体都会起作用。然而,我支持第一个类型独立(或类型不可知)变体。另见@AnT谢谢,我现在明白了!我可能得把课本再看一遍。我不知道我可以这样做。如果
square
是一个类型名,那么您想通过
result->square
说什么?这在C中没有任何意义。在C中
->
是一个成员访问操作符。而且您的结构没有名为
square
的成员。类似于
anytype**
的东西不是二维数组,也不能指向二维数组!而且你应该阅读并提供一份报告。