在函数 C 中创建并填充动态数组

Create and fill a dynamic array within function C

我需要扫描 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 打印了正确的元素,但是我有一个关于空指针的警告。

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

当您更改 input 中的 buff 时,main 中的

data 不会更改。换句话说 - 当 input 函数 returns.

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);

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

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