调用函数后如何设置全局数组的大小? (C)

时间:2017-09-28 15:43:18

标签: c

调用函数后是否可以设置全局数组的大小?示例:如果您正在从文件中读取某些数字,并且希望将这些数字存储在全局数组中,但在从文件中读取这些数字之前,您不知道有多少这些数字,那么数组的大小是未知。

4 个答案:

答案 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()];

这样,您可以根据函数调用有效地设置数组的大小。

当然,只有你的数组是一个局部变量才有可能,如果它必须是全局的,那么动态内存分配是你唯一的选择。