调用函数后是否可以设置全局数组的大小?示例:如果您正在从文件中读取某些数字,并且希望将这些数字存储在全局数组中,但在从文件中读取这些数字之前,您不知道有多少这些数字,那么数组的大小是未知。
答案 0 :(得分:1)
不,数组无法调整大小。所以如果你有像
这样的东西int myArray[10];
你无法改变大小。
你可以做的是使用动态内存,如:
int* myArray;
int main(void)
{
int myArraySize = 10;
myArray = malloc(myArraySize * sizeof(int)); // Allocate memory for 10 int
if (myArray == NULL)
{
// Out of memory
return -1;
}
// Now you can use myArray just like an ordinary array,
// like myArray[0] to myArray[9]
//..... Read from file in a loop
int numbersRead = 0;
while (....)
{
// Read a number from the file
number = .....;
if (numbersRead == myArraySize)
{
// No more space in array
// Use realloc to allocate
// more memory, i.e. so that you change the "array" size
// Update myArraySize to the new array size
}
myArray[numbersRead] = number;
numbersRead++;
}
free(myArray);
return 0;
}
顺便说一句 - 一般来说,你应该避免全局变量
答案 1 :(得分:0)
标准C数组需要在编译时标注尺寸,因此编译器/链接器可以为它们分配空间 这显然排除了任何运行时大小调整。
当然,您可以在堆上使用malloc
分配它们,这样可以实现运行时大小调整。
答案 2 :(得分:0)
你说C,所以我希望你使用动态内存(malloc)。
有一种方法可以分配内存,然后将其缩小。 或者你尝试一小块并长出来。使用realloc重新调整内存大小。
另一种策略是首先计算所需的尺寸。 如果您知道文件中的每个数字需要2个字节,那么如果您有文件大小,则很容易获得数组的大小。
这一切都是为了动态记忆。静态内存(例如int a [3])不能在运行时更改。
答案 3 :(得分:0)
似乎没有人提到变长数组。你可以这样做:
int myarray[getSizeFunction()];
这样,您可以根据函数调用有效地设置数组的大小。
当然,只有你的数组是一个局部变量才有可能,如果它必须是全局的,那么动态内存分配是你唯一的选择。