C 我可以迭代动态数组而不知道它的大小吗

C 我可以迭代动态数组而不知道它的大小吗,c,dynamic-memory-allocation,C,Dynamic Memory Allocation,我在结构的动态数组中分配了一些数据。我可以在不知道它的大小的情况下迭代它吗 这样行吗 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

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

这样行吗

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
不够大,无法容纳所有字符,则函数调用会导致未定义的行为

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

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
的实现会将大小存储在数据之前。但不要试图利用这一点。它只会导致严重的头痛。

唯一有效的方法是在数组中有一个指示结束的哨兵值。C中的字符串就是这样工作的

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

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

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
的实现会将大小存储在数据之前。但不要试图利用这一点。它只会导致严重的头痛。

不。其实很简单——因为你不知道大小就不能重复任何东西。用任何语言。其他语言可能会为您跟踪数组的大小,但C不会这样做。这真的很简单——因为你不能在不知道大小的情况下迭代任何东西。用任何语言。其他语言可能会为您跟踪数组的大小,但C不会这样做。。。。或存储的长度separately@eewanco是的,但op明确表示长度不应单独存储。@eewanco哦,我误读了。编辑。。。。。。或存储的长度separately@eewanco是的,但op明确表示长度不应单独存储。@eewanco哦,我误读了。编辑。。。