我正在尝试创建一个没有大小限制的整型和浮点型数组(它可能为0,也可能会在用户使用程序时增加大小)。
我曾尝试执行以下操作:
int bills[];
float totalAmount[];
我不能指定一个最大大小,因为我正在使用for循环打印每个数组(如果我指定了99的大小,我将打印99行,而我不想要那样)。
C不支持具有动态元素数量的数组。数组的元素数量必须在编译时确定,或者自C99以来可以在创建时运行时计算确定。一旦数组被创建,其大小就是固定的,无法更改。在数组定义或数组声明中,有几种情况下大小没有在[]
之间明确指定。
如果提供了初始化程序,则可以在左侧维度上没有明确大小的情况下定义数组。编译器将从初始化程序推断出其大小:
int a[] = { 1, 2, 3 }; // equivalent to int a[3] = { 1, 2, 3 };
int m[][2] = {{ 1, 2 }, { 3, 4 }}; // equivalent to int m[2][2] = {{ 1, 2 }, { 3, 4 }};
char s[] = "Hello world\n"; // equivalent to char s[13] = "Hello world\n";
请注意编译器在字符串情况下添加隐式的空终止符。
在多种情况下,您可以声明左侧维度没有大小指示符的数组:
extern
类存储的全局变量(数组在其他地方定义),int main(int argc, char *argv[])
。在这种情况下,左侧维度的大小规定将被忽略。struct
的最后一个成员。这是C99的一种扩展,称为柔性数组。编译器没有有关这些数组实际大小的信息。程序员将使用其他信息确定长度,例如从单独的变量或数组内容中获取长度。
对于函数参数,数组将作为指针传递,即使指定了元素数量,sizeof(argv)
也将计算为指针大小。
typeid(the_variable).name
)。 - HelloGoodbye您不能声明一个没有大小的数组,而是应该声明一个指向若干个记录的指针。
因此,如果您想这样做:
int bills[];
int* bills;
你将需要在某个时刻分配大小并初始化数组。
bills = (int*)malloc(sizeof(int)*items);
对于其他数据类型的数组也是如此。如果直到运行时才知道数组的大小,则应使用指向在运行时分配给正确大小的内存的指针。
bills = malloc(sizeof * bills * items);
,而那些老程序员则应该放弃他们的旧习惯。 现代C希望不再依赖于旧的C。 这是30年来C程序员的经验得出结论,最好以这种方式写它。 - Stargateurmalloc()
(或calloc()
)、realloc()
和 free()
的组合来实现这一点。const
)BLOCK_SIZE
。#define BLOCK_SIZE 10
首先声明一个适当类型的指针并分配第一个块。
请注意,malloc()
和 realloc()
在出现一些错误,如内存不足等原因时会返回NULL
。
int *ptr=malloc(sizeof(int)*BLOCK_SIZE);
if(ptr==NULL)
{
perror("some error");
return 1;
}
int max_index = BLOCK_SIZE-1;
for(int i=0; ; ++i)
{
if(i > max_index)
{
ptr=realloc(ptr, (max_index+1 + BLOCK_SIZE)*sizeof(int));
if(ptr == NULL)
{
perror("insufficient memory!");
break;
}
printf("\nRealloced!");
max_index += BLOCK_SIZE;
}
scanf("%d", &ptr[i]);
printf("\n%d: %d", i, ptr[i]);
}
max_index
。如果是,就会使用realloc()
分配另一个内存块,并读取值。free(ptr);
malloc()
实际上与realloc()
相同,只是后者的第一个参数为NULL
。calloc()
的返回值转换为目标指针类型,因为返回的是一个void
指针,它会自动转换。我认为你可以给它一个最大尺寸,如果你只想显示前几个元素,你可以使用一个for循环仅限于该元素,对于输入也是如此,如果你想初始化前30个元素,就用一个for循环到30。
malloc()
和free()
文档。 - Tanveer Badarmalloc()
和realloc()
来寻找简单的解决方案。 - Stargateurint bills[99];
,然后单独跟踪已使用项目的数量。无论如何,您都需要跟踪钞票的数量。 - Bo Persson