我可以在不知道它的大小的情况下迭代动态数组吗

Can I iterate dynamic array without knowing the size of it

我在一个struct的动态数组中分配了一些数据。我可以在不知道它的大小的情况下迭代 struct * 吗?

这行得通吗?

int main() {
    struct *foo = NULL;

    //struct filling

    iterate_foo(foo);
}

void iterate_foo(struct *foo) {
    int i=0;
 
    while (foo[i] != NULL) {    // Would this work?

        //something
    }
}

唯一可行的方法是数组中有一个指示结束的标记值。 C 中的字符串就是这样工作的。

例如,如果您调用 strcpy(a, b),则 b 中的字符将被复制到 a,直到并包括零值。如果 b 数组中没有零终止符,或者如果 a 不够大以容纳所有字符,则函数调用会导致未定义的行为。

如果您不想使用标记值,您可以选择将大小作为单独的参数传递。另一种方法是将东西包装在容器结构中,如下所示:

struct container {
    struct mystruct *data;
    size_t size;
}

此外,struct *foo = NULL;是错误的。它必须类似于 struct mystruct *foo = NULL;

但是如果你有这个代码:

void foo(T *ptr) {
    // Do something
}

int main(void) {
    T *a = malloc(N * sizeof *a);
    T b[N];
    foo(a);
    foo(b);
}

foo就完全不可能用可移植的方式算出N了。在某些情况下,相信 malloc 的实现会在数据之前存储大小。但不要试图利用它。只会引起剧烈的头痛。