C 有没有一种方法可以在不定义大小的情况下初始化数组

C 有没有一种方法可以在不定义大小的情况下初始化数组,c,C,是否有一种方法可以在不定义大小的情况下初始化数组。 当循环运行时,数组的大小会自行增加,因为它会重新分配数组。没有现成的东西。您必须创建自己的类似于数组的数据结构来实现这一点。如果你小心的话,它应该不会很难实现 大致上,您要寻找的是一个数据结构,它在创建时(例如,使用malloc)分配预定义的大小,并开始使用其中的连续空间作为数组的插槽。然后,随着更多项目的添加,它会重新分配(比如,使用realloc)该空间 当然,您将无法使用在简单数组中使用的索引器语法。相反,您的数据结构必须在引擎盖下提供自

是否有一种方法可以在不定义大小的情况下初始化数组。
当循环运行时,数组的大小会自行增加,因为它会重新分配数组。

没有现成的东西。您必须创建自己的类似于数组的数据结构来实现这一点。如果你小心的话,它应该不会很难实现

大致上,您要寻找的是一个数据结构,它在创建时(例如,使用
malloc
)分配预定义的大小,并开始使用其中的连续空间作为数组的插槽。然后,随着更多项目的添加,它会重新分配(比如,使用
realloc
)该空间


当然,您将无法使用在简单数组中使用的索引器语法。相反,您的数据结构必须在引擎盖下提供自己的一对
set
/
get
函数来处理上述问题。因此,
set
函数将检查其参数中指定的索引,如果该索引大于数组的当前大小,则执行重新分配。然后,在任何情况下,设置提供给指定索引的值。

没有现成的。您必须创建自己的类似于数组的数据结构来实现这一点。如果你小心的话,它应该不会很难实现

大致上,您要寻找的是一个数据结构,它在创建时(例如,使用
malloc
)分配预定义的大小,并开始使用其中的连续空间作为数组的插槽。然后,随着更多项目的添加,它会重新分配(比如,使用
realloc
)该空间


当然,您将无法使用在简单数组中使用的索引器语法。相反,您的数据结构必须在引擎盖下提供自己的一对
set
/
get
函数来处理上述问题。因此,
set
函数将检查其参数中指定的索引,如果该索引大于数组的当前大小,则执行重新分配。然后,在任何情况下,设置为指定索引提供的值。

您可以初始化数组而不指定大小,但除非在使用数组之前为其分配了空间,否则该数组将不会有用。通常,当您在C中声明变量时,编译器会在“堆栈”上为该变量保留特定数量的内存。但是,如果您希望数组能够在整个程序中增长,这不是您想要的,因为为“堆栈”上的变量分配的空间量是静态的

因此,解决方案是让程序决定在运行时(而不是编译时)为变量分配多少内存。这样,当程序运行时,您就可以决定变量需要保留多少空间

实际上,这称为动态内存分配,它是在C中使用函数malloc()和realloc()完成的。我建议你仔细阅读这些函数,我认为它们对你非常有用

如果您有后续问题,请随时提问

最后一件事


无论何时使用malloc()为变量分配内存,都应该记住在程序结束时或使用完该变量后调用该变量的free()函数。

可以初始化数组而不指定大小,但除非在使用之前为数组分配了空间,否则该数组将不会有用。通常,当您在C中声明变量时,编译器会在“堆栈”上为该变量保留特定数量的内存。但是,如果您希望数组能够在整个程序中增长,这不是您想要的,因为为“堆栈”上的变量分配的空间量是静态的

因此,解决方案是让程序决定在运行时(而不是编译时)为变量分配多少内存。这样,当程序运行时,您就可以决定变量需要保留多少空间

实际上,这称为动态内存分配,它是在C中使用函数malloc()和realloc()完成的。我建议你仔细阅读这些函数,我认为它们对你非常有用

如果您有后续问题,请随时提问

最后一件事


无论何时使用malloc()为变量分配内存,都应该记住在程序结束时或使用完该变量时调用该变量的free()函数。

下面是这种数据结构的一个简单实现(对于
int
s,但是您可以用您需要的任何类型替换
int
)。为了清晰起见,我省略了错误处理

typedef struct array_s {
    int len, cap;
    int *a;
} array_s, *array_t;

/* Create a new array with 0 length, and the given capacity. */
array_t array_new(int cap) {
    array_t result = malloc(sizeof(array_s));
    array_s a = {0, cap, malloc(sizeof(int) * cap)};
    *result = a;
    return result;
}

/* Destroy an array. */
void array_free(array_t a) {
    free(a->a);
    free(a);
}

/* Change the size of an array, truncating if necessary. */
void array_resize(array_t a, int new_cap) {
    result->cap = new_cap;
    result->a = realloc(result->a, new_cap * sizeof(int));
    if (result->len > result->cap) {
        result->len = result->cap;
    }
}

/* Add a new element to the end of the array, resizing if necessary. */
void array_append(array_t a, int x) {
    if (result->len == result->cap) {
        // max the new size with 4 in case cap is 0.
        array_resize(a, max(4, result->cap * 2));
    }
    a->a[a->len++] = x;
}

通过存储
len
(数组的当前长度)和
cap
(为数组保留的空间量),可以将数组扩展到O(1)中,直到
len
cap
时,然后调整数组大小(例如:使用
realloc
),可能是将现有的
cap
乘以2或1.5或其他。这是大多数向量或列表类型在支持可调整大小数组的语言中所做的。我在
array\u append
中对此进行了编码,作为一个示例。

下面是这种数据结构的一个简单实现(对于
int
s,但是您可以用您需要的任何类型替换
int
)。为了清晰起见,我省略了错误处理

typedef struct array_s {
    int len, cap;
    int *a;
} array_s, *array_t;

/* Create a new array with 0 length, and the given capacity. */
array_t array_new(int cap) {
    array_t result = malloc(sizeof(array_s));
    array_s a = {0, cap, malloc(sizeof(int) * cap)};
    *result = a;
    return result;
}

/* Destroy an array. */
void array_free(array_t a) {
    free(a->a);
    free(a);
}

/* Change the size of an array, truncating if necessary. */
void array_resize(array_t a, int new_cap) {
    result->cap = new_cap;
    result->a = realloc(result->a, new_cap * sizeof(int));
    if (result->len > result->cap) {
        result->len = result->cap;
    }
}

/* Add a new element to the end of the array, resizing if necessary. */
void array_append(array_t a, int x) {
    if (result->len == result->cap) {
        // max the new size with 4 in case cap is 0.
        array_resize(a, max(4, result->cap * 2));
    }
    a->a[a->len++] = x;
}
通过存储
len
(数组的当前长度)和
cap
(为数组保留的空间量),可以将数组扩展到O(1)中,直到
len
cap
时,然后调整数组大小(例如:使用
realloc
),可能是将现有的
cap
乘以2或1.5或其他什么