我可以在不知道它的大小的情况下迭代动态数组吗
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
的实现会在数据之前存储大小。但不要试图利用它。只会引起剧烈的头痛。
我在一个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
的实现会在数据之前存储大小。但不要试图利用它。只会引起剧烈的头痛。