使用realloc()C数组不会改变大小

时间:2018-03-07 18:30:42

标签: c struct

我想在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));

我希望你能帮助我 - 谢谢!

2 个答案:

答案 0 :(得分:0)

首先在C中,Arrayspointers是不同的。一个数组不能被视为pointer的东西。为了理解目的,你可以假设数组名称假设{{1 } arr(但它们实际上不是const pointers)。所以当const pointer更改arr变量的地址时,无法更改它。

完成此讨论:Is an array name a pointer?

答案 1 :(得分:0)

您无法从realloc返回的指针确定重新分配的数组的大小,您必须手动跟踪大小,并使用单独的变量,例如length

sizeof(stone)计算指针大小,即架构上的4个字节。

另请注意,索引数组比您编写的数组简单得多。您可以通过以下方式计算指向数组最后一个元素的指针:

STONE *d = stone + length - 1;

您可以这样传递数组中的最后一个指针:

ausgabeBS(stone[length - 1]);