我想在C中重新分配一个结构数组(在结尾添加一个结构)但它不会改变它的大小:
typedef struct stone {
int height;
int width;
int length;
int color;
} STONE;
int main() {
STONE *stone;
stone = (STONE *)calloc(1, sizeof(STONE));
int length = 0;
int command = 1;
while (command != 0) {
printf("Choose the method: \n");
printf("[0] - add stone\n");
printf("[1] - show stone\n");
printf("[2] - remove stone\n");
printf("[3] - compare stone\n");
printf("[4] - exit program\n");
printf("Input: ");
scanf("%d", &command);
switch (command) {
case 0:
length++;
stone= (STONE *)realloc(stone, sizeof(STONE) * length);
STONE *d = stone+ (sizeof(STONE) * (length - 1));
break;
case 1:
ausgabeBS(*(stone + length * sizeof(STONE) - sizeof(STONE)));
break;
case 2:
break;
case 3:
break;
default:
return 0;
}
}
return 0;
}
这是为什么?我输出数组的大小,它总是保持4字节。
//code I used to output the size
printf("%d", sizeof(stone));
我希望你能帮助我 - 谢谢!
答案 0 :(得分:0)
首先在C中,Arrays
和pointers
是不同的。一个数组不能被视为pointer
的东西。为了理解目的,你可以假设数组名称假设{{1 } arr
(但它们实际上不是const pointers
)。所以当const pointer
更改arr变量的地址时,无法更改它。
答案 1 :(得分:0)
您无法从realloc
返回的指针确定重新分配的数组的大小,您必须手动跟踪大小,并使用单独的变量,例如length
。
sizeof(stone)
计算指针大小,即架构上的4个字节。
另请注意,索引数组比您编写的数组简单得多。您可以通过以下方式计算指向数组最后一个元素的指针:
STONE *d = stone + length - 1;
您可以这样传递数组中的最后一个指针:
ausgabeBS(stone[length - 1]);