如何在运行时增长C中的指针或数组(编译时不知道结束长度)

mtb9vblg  于 2023-03-01  发布在  其他
关注(0)|答案(2)|浏览(81)

我想在运行时增长一个数组(不用macos预先指定长度)
我有以下问题
1.可以用数组来实现吗?
1.如果没有,我应该使用一个指针到整数?
我尝试了以下代码(并期望012作为输出),但得到的是000

#include <stdlib.h>
#include <stdio.h>

int main()
{
    int *arr = NULL; 
    size_t n = 0; 
    for (int i = 0; i < 3; ++i) { 
        arr = realloc(arr, (n + 1) * sizeof *arr); 
        arr[n++] = i; 
        printf("%d", *arr);
    } 
}
xu3bshqb

xu3bshqb1#

大部分都在操作室。
每次只打印第一个元素。

// printf("%d", *arr);
    printf("%d", arr[n-1]);

可以用数组来实现吗?
不可以。在C语言中,数组一旦定义就不能改变大小。
但是,* 指针 * 分配和引用的内存大小可以更改。

qf9go6mv

qf9go6mv2#

重新分配数组的方法很好,尽管效率很低。没有得到预期输出的原因是输出了第一个元素3次。
如果您事先知道最终长度,建议一次性分配数组;在其他情况下,如果需要动态重新分配大型数组,建议使用按几何级数递增的大小进行重新分配:
下面是一个使用黄金分割率的例子:

#include <stdlib.h>
#include <stdio.h>

int main() {
    char *arr = NULL; 
    size_t size = 0;
    size_t pos = 0;
    int c;
    while ((c = getchar()) != EOF) {
        if (pos + 1 > size) {
            // increase size by a ratio of 1.625
            // with an offset to handle the initial case without a test
            size_t new_size = size + (size >> 1) + (size >> 3) + 32;
            char *new_arr = realloc(arr, sizeof(*arr) * new_size);
            if (new_arr == NULL) {
                fprintf(stderr, "cannot reallocate array for %zu bytes\n", new_size);
                free(arr);
                return 1;
            }
            arr = new_arr;
            size = new_size;
        }
        arr[pos++] = c;
    }
    if (arr == NULL) {
        fprintf(stderr, "empty file\n");
        return 1;
    }
    arr[pos] = '\0';
    char *new_arr = realloc(arr, sizeof(*arr) * (pos + 1));
    if (new_arr != NULL) {
        arr = new_arr;
        size = pos + 1;
    }
    /* more code to handle full buffer */
    free(arr);
    return 0;
}

相关问题