c-malloc是否隐式定义了数组中元素的数量



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

考虑以下内容:

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*(类型为node的单个元素数组占用的字节数(,并将其分配给指针test2test2而不是数组,并且它不包含任何可以定义/声明的元素

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

到";创建";对于CCD_ 5和对于一维CCD_数组不是指针指针不是数组

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

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

还有calloc,您可以指定多个元素和元素大小,使您的分配代码更容易理解和验证,但它也不在乎您在分配内存后如何处理内存。

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

在C中,你可以做很多没有任何意义的事情,这些事情只是未定义的行为,所以不要认为这是因为它编译了有效的代码。

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

相关内容

  • 没有找到相关文章

最新更新