【问题标题】:Create and fill a dynamic array within function C在函数 C 中创建并填充动态数组
【发布时间】:2021-09-28 13:54:40
【问题描述】:

我需要扫描n 数字,然后用以下扫描的n 数字填充一个数组。我必须在函数中同时使用n 和数组输入,以及使用动态内存。

void input(int* buff, int* n);

int main() {
    int* data = NULL;
    int n;
    input(data, &n);

    for (int i = 0; i < n; ++i) {
        printf("%d ", data[i]);
    }
    return 0;
}

void input(int* buff, int *n) {
    if (scanf("%d", n) == 1 && getchar() == '\n') {
        if (*n <= 0) {
            error = 1;
        }
    }

    if (error == 0) {
        buff = (int*)calloc(*n, sizeof(int));
        if (buff == NULL) {
            error = 1;
        }
    }


 if (error == 0) {
        int count = 0;
        int p;
        for (int i = 0; i < *n; i++) {
            if (1 == scanf("%d", &p)) {
                if (count < *n) {
                    *(buff + count) = p;
                    count++;
                }
            }
       }

for (int i = 0; i < *n; i++) {
    printf("%d, ", *(buff + i));
    }
}

我没有在第一个 for 中插入我的程序的所有逻辑,因为它并不真正重要。 最后一个 for 打印正确的元素,但是我有一个关于空指针的警告。

当我返回main 并尝试打印时,我遇到了关于禁止读取访问的错误。 我哪里做错了?

【问题讨论】:

    标签: arrays c dynamic


    【解决方案1】:

    main 中的datainput 中更改buff 时不会更改。换句话说 - 当input 函数返回时,data 仍然为 NULL。

    就像n... 对于n,你正确地传递了一个指向n 的指针,你需要对data 做同样的事情。

    喜欢:

    void input(int** buff, int *n) {
                  ^^
               // Notice the two *, i.e. pointer-to-pointer
        ....
        *buff = calloc(....
        ....
    

    然后这样称呼它

    input(&data, &n);
    

    【讨论】:

    • 如果我需要在这个函数中为buff 分配一个扫描值,我应该使用它吗? *buff[count] = p
    • @Arzental 在您当前的代码中(在我建议的更改之后),您将所有 buff 替换为 (*buff)
    • 谢谢,它有帮助。我找到了 a[2] == *(a + 2) == *(2 + a) == 2[a] 所以在我的情况下是 *(*buff + count) == *buff[count] ?但是正确的部分不起作用。不像你的修正(左)。
    • @Arzental 检查 C 运算符优先级...问问自己:*buff[count]*(buff[count]) 相同还是与 (*buff)[count] 相同。这很重要......换句话说......当我告诉你用(*buff)替换buff时,(....)是有原因的
    • @Arzental 我强烈推荐:int n; --> int n = 0;
    【解决方案2】:

    如果你只需要在你的函数中分配一个动态数组,你可以返回一个指向它的指针:

    int *input(int *buf, int *n);
    ...
        data = input(data, &n);
    ...
    int *input(int* buff, int *n) {
        ...
        return buff;
    }
    

    【讨论】:

    • Nitpick:如果input返回一个指向已分配内存的指针,则不需要buff作为函数参数。
    • @4386427:你是对的,除了允许使用现有的(分配的)数组或在需要时使用 realloc 增加它。但我应该在我的回答中说出来。今天有点懒……
    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 2020-02-14
    • 2021-10-06
    • 2023-01-24
    • 2017-03-22
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多