Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Arrays malloc是否隐式定义数组中的元素数?_Arrays_C_Pointers_Malloc - Fatal编程技术网

Arrays malloc是否隐式定义数组中的元素数?

Arrays malloc是否隐式定义数组中的元素数?,arrays,c,pointers,malloc,Arrays,C,Pointers,Malloc,我写了一篇文章,说这是一个重复的问题,所以这篇文章被关闭了。这不是一个重复的问题。虽然我真的很感激响应者花费了大量的时间和精力,但他们的回答往往无法解释发生了什么。请投票重新开放 考虑以下几点: typedef struct node { int number; struct node *left; struct node *right; } node; node *test1 = malloc(511 * sizeof(node)); node (*test2

我写了一篇文章,说这是一个重复的问题,所以这篇文章被关闭了。这不是一个重复的问题。虽然我真的很感激响应者花费了大量的时间和精力,但他们的回答往往无法解释发生了什么。请投票重新开放

考虑以下几点:

typedef struct node
{
    int number;
    struct node *left;
    struct node *right;
} node;



node  *test1 = malloc(511 * sizeof(node));
node  (*test2)[1] = malloc(511 * sizeof(node));
test1是指针,但我们可以引用test1[510],test2是指向包含1个元素的数组的指针,但我们可以引用test2[510][0]

在第一种情况下,我基本上创建了一个一维数组,在第二种情况下创建了一个二维数组


在这两种情况下,我认为malloc隐含地定义了元素的数量,对吗?

这里定义的数组中的元素数量:
node(*test2)[1]

node  (*test2)[1] = malloc(511 * sizeof(node));
首先,您不应该在malloc中仅使用类型对象

node  (*test2)[1] = malloc(511 * sizeof(*test2));
此行分配N个字节的内存,其中N为511*(由
节点类型的单元素数组占用的字节数),并将其分配给指针
test2
test2
不是一个数组,它没有任何可以定义/声明的元素

在第一种情况下,我基本上创建了一个一维数组 第二种是二维数组

要“创建”二维数组,您需要
节点arr2d[x][y]
,对于一维
节点arr1d[x]
数组不是指针指针不是数组


顺便说一句,如果你忽略了答案,那么写答案有什么意义呢?

它被隐式定义为,作为程序员,你需要了解在使用分配的结构时有哪些限制
malloc
本身并不关心您所要求的大小以外的任何事情

还有
calloc
,您可以指定元素数量和元素大小,以使分配代码更容易理解和验证,但它也不关心分配后如何处理内存

您可以将
malloc
的结果分配给您想要的任何对象,但应该将其分配给有意义的指针类型

在C语言中,你可以做很多没有意义的事情,这些都是未定义的行为,所以不要这样认为,因为它编译的是有效的代码


记住,C根本不做任何边界检查。这完全是程序员的责任。

malloc只知道您请求的N字节。但我们使用511的唯一地方是malloc。那么我们还要在哪里定义数组中的元素数呢?
test2
不是一个仅用于数组的指针。因此,我们不定义元素的数量。您所说的“我们可以引用test2[510][0]”到底是什么意思?test2[200][0]。数量=17。第一个节点->第200个数组中的数字我没有忽略答案,我只是不理解它们。我认为指针是地址,数组是内存块,这不对吗?当我执行node(*test2)[1]=malloc(511*sizeof(*test2));我可以将其作为二维数组访问。test2[200][0],个数=17;第200个arrayconsider中的第一个节点->编号;节点测试[511][1];在这里我可以访问test[200][0]。number=17;