我写了一篇帖子,说这是一个重复的问题,所以关闭了。这不是一个重复的问题。虽然我真的很感激响应者付出的时间和精力,但他们的答案往往无法解释发生了什么。请投票重新开放。
考虑以下内容:
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
的单个元素数组占用的字节数(,并将其分配给指针test2
。test2
是而不是数组,并且它不包含任何可以定义/声明的元素
所以在第一种情况下,我基本上创建了一个一维数组第二个是二维阵列。
到";创建";对于CCD_ 5和对于一维CCD_数组不是指针且指针不是数组
顺便问一句,如果你忽略了答案,写答案有什么意义?
它被隐式定义为,在中,程序员需要了解使用分配的结构时有哪些限制。malloc
本身并不关心您所要求的大小以外的任何其他内容。
还有calloc
,您可以指定多个元素和元素大小,使您的分配代码更容易理解和验证,但它也不在乎您在分配内存后如何处理内存。
您可以将malloc
的结果分配给您想要的任何对象,但应该将其分配给有意义的指针类型。
在C中,你可以做很多没有任何意义的事情,这些事情只是未定义的行为,所以不要认为这是因为它编译了有效的代码。
请记住,C根本不进行任何边界检查。这完全是程序员的责任。