在此代码中使用realloc-我的数组的大小不会增加 我一直在C++编程,但是我正在学习C。 我正在尝试下面的代码,试图理解realloc的行为 这是我的结构 struct foo{ int a; int b; };

在此代码中使用realloc-我的数组的大小不会增加 我一直在C++编程,但是我正在学习C。 我正在尝试下面的代码,试图理解realloc的行为 这是我的结构 struct foo{ int a; int b; };,c,arrays,C,Arrays,这就是我使用它的方式。最初我想创建一个大小为2的数组。(我设法做到了)。然后我想将同一数组的大小增加到3,以保留其以前的内容,因此我使用realloc。这是我的密码 //Create array of size 2 struct foo* farry = malloc(2 * sizeof(struct foo)); farry[0].a =1; farry[1].a =2; for(i=0 ; i<=(sizeof(farry)/sizeof(farry[0])) ; i++) {

这就是我使用它的方式。最初我想创建一个大小为2的数组。(我设法做到了)。然后我想将同一数组的大小增加到3,以保留其以前的内容,因此我使用realloc。这是我的密码

//Create array of size 2
struct foo* farry = malloc(2 * sizeof(struct foo)); 
farry[0].a =1;
farry[1].a =2;
for(i=0 ; i<=(sizeof(farry)/sizeof(farry[0])) ; i++)
{
    printf("Value %d \n",farry[i].a );
}


 printf("-----Increasing the size of the array \n");
 //Increase the size 
 int oldsize = sizeof(farry)/sizeof(farry[0]);
 farry = realloc(farry, (oldsize+1) * sizeof(struct foo));
 printf("new size is %d \n",sizeof(farry)/sizeof(farry[0]) );
 farry[2].a =3;
for(i=0 ; i<=(sizeof(farry)/sizeof(farry[0])) ; i++)
{
    printf("Value %d \n",farry[i].a );
}
我原以为新尺寸是3,打印1,2,3,但它的新尺寸是1,为什么?在上述情况下,旧尺码和新尺码是相同的。如果有人能解释我可能遗漏了什么或做错了什么,我将不胜感激

struct foo* farry = malloc(2 * sizeof(struct foo)); 
...
int oldsize = sizeof(farry)/sizeof(farry[0]);
sizeof(farry)/sizeof(farry[0])
提供指针的大小/结构的大小,而不是元素的数量


sizeof(farry)/sizeof(farry[0])
提供指针的大小/结构的大小,而不是元素的数量。

如果我没有弄错的话,它实际上可能是零。你能解释一下它有时可以工作吗(比如:
struct foo farry[]
)是的,我在这里读到,如果它是指针,那么数组中不可能没有元素。我不知道C程序员是如何处理这种情况的?我的意思是,在structure的情况下,如何创建一个包含2个项目的数组?是
malloc(2*sizeof(struct foo))
是否正确?@JamesFranco您需要将
struct foo
s的编号保存在一个单独的变量中(或单独的
struct
),或者使用类似链表的数据结构。是的,这是正确的,虽然惯例是使用
sizeof(*farry)
,但是如果
farry
的类型发生变化,您需要维护的代码就会更少。@Jean-Françoisfab,它很可能是零,取消引用指针([0])会给出结构本身的大小,在我的计算机上编译8/8=1如果你的结构足够大,是的。如果我没有弄错的话,实际上它很可能是零。你能解释一下它有时可以工作吗(比如:
struct foo farry[]
)是的,我在这里读到,如果它是指针,那么数组中不可能没有元素。我不知道C程序员是如何处理这种情况的?我的意思是,在structure的情况下,如何创建一个包含2个项目的数组?是
malloc(2*sizeof(struct foo))
是否正确?@JamesFranco您需要将
struct foo
s的编号保存在一个单独的变量中(或单独的
struct
),或者使用类似链表的数据结构。是的,这是正确的,虽然惯例是使用
sizeof(*farry)
,但是如果
farry
的类型发生变化,您需要维护的代码就会更少。@Jean-Françoisfab,它很可能是零,取消引用指针([0])会给出结构本身的大小,在我的计算机上编译8/8=1如果您的结构足够大,则可以。
struct foo* farry = malloc(2 * sizeof(struct foo)); 
...
int oldsize = sizeof(farry)/sizeof(farry[0]);