在C中存储未知迭代次数的while循环的结果

在C中存储未知迭代次数的while循环的结果,c,arrays,pointers,while-loop,malloc,C,Arrays,Pointers,While Loop,Malloc,我有一个while循环,当满足if(condition){break;}时,在未知的迭代次数后,该循环退出。在while循环中,调用一个函数,该函数将在每次迭代时返回一个大小可变的数组。我知道在python中,我可以将数组一个接一个地附加在一起,最后我会得到一个大小可变的数组数组。在C中,正确的方法是什么 以下是我的代码的相关部分(我知道它不是MWE,很多部分缺失,但我希望它仍然可以理解): 您需要将零存储在foo中,独立于find_zeros返回的值,就像在Python中一样,在Python中

我有一个
while
循环,当满足
if(condition){break;}
时,在未知的迭代次数后,该循环退出。在
while
循环中,调用一个函数,该函数将在每次迭代时返回一个大小可变的数组。我知道在
python
中,我可以将数组一个接一个地附加在一起,最后我会得到一个大小可变的数组数组。在
C
中,正确的方法是什么

以下是我的代码的相关部分(我知道它不是MWE,很多部分缺失,但我希望它仍然可以理解):


您需要将零存储在
foo
中,独立于
find_zeros
返回的值,就像在Python中一样,在Python中,您将有单独的变量
zeros\u list
zeros

Python的
list.append
方法分两步实现:首先使用
realloc
将数组重新分配到新容量(您已经拥有了该部分),然后将新值分配给新的可用空间。由于要创建数组数组,还需要使用
memcpy()
将值从临时位置复制到新位置。例如(未经测试,在没有MWE的情况下):

用法示例:

int cnt;
struct floatvec *all_zeros = foo(&cnt);
for (int i = 0; i < cnt; i++) {
    struct floatvec *curr = all_zeros[i];
    for (int j = 0; j < curr->length; j++)
        printf("%lf\n", curr->values[j]);
}
int-cnt;
struct floatvec*all_zeros=foo(&cnt);
对于(int i=0;ilength;j++)
printf(“%lf\n”,curr->values[j]);
}
几个不相关的注释:

  • 不要把结果抛在脑后
  • 检查
    malloc
    是否返回NULL并中止程序或向调用者返回错误

EDIT:更新答案以匹配编辑的问题。

您需要将零存储在
foo
中,独立于
find_zero
返回的值,就像在Python中一样,在Python中,您将有单独的变量
zero_list
zero

Python的
list.append
方法分两步实现:首先使用
realloc
将数组重新分配到新容量(您已经拥有了该部分),然后将新值分配给新的可用空间。由于要创建数组数组,还需要使用
memcpy()
将值从临时位置复制到新位置。例如(未经测试,在没有MWE的情况下):

用法示例:

int cnt;
struct floatvec *all_zeros = foo(&cnt);
for (int i = 0; i < cnt; i++) {
    struct floatvec *curr = all_zeros[i];
    for (int j = 0; j < curr->length; j++)
        printf("%lf\n", curr->values[j]);
}
int-cnt;
struct floatvec*all_zeros=foo(&cnt);
对于(int i=0;ilength;j++)
printf(“%lf\n”,curr->values[j]);
}
几个不相关的注释:

  • 不要把结果抛在脑后
  • 检查
    malloc
    是否返回NULL并中止程序或向调用者返回错误

编辑:更新答案以匹配编辑的问题。

关于您的问题:

//在某处追加零(如何?!)

最简单的方法是调用
memcpy()
,类似于:

memcpy( &zeros[ last used offset ], newXeros, sizeof( newzeros ) );

关于你的问题:

//在某处追加零(如何?!)

最简单的方法是调用
memcpy()
,类似于:

memcpy( &zeros[ last used offset ], newXeros, sizeof( newzeros ) );

标准技术是根据需要分配缓冲区并使其增长(使用
realloc
)。如果在
find_zero
中分配内存并返回指向此内存的指针,则调用方不知道其大小,也不知道实际使用了多少元素。也许您应该返回一个同时包含
zero
z
的结构@Bodo我更改了代码,现在
zero
作为参数传递给函数
find_zeros()
,而
z
是输出,你认为它更好吗?如果
N
是一个全局常数,那么这个解决方案可能足以进行一次调用,但是当你想在调用者中重新分配缓冲区并在循环中调用
find_zero
时,你应该传递第一个空闲元素的地址和空闲元素的数量(如果不是全局
N
).仅供参考,malloc不会初始化分配的空间,因此内部可能有任何内容。如果要分配和初始化空间,可以使用calloc,它的工作原理与malloc相同,但使用所有0初始化分配的空间。标准技术是分配一个缓冲区,并根据需要(使用
realloc
)对其进行增长。如果在
中分配内存,则查找零并返回指向该内存的指针,调用者不知道它的大小,也不知道实际使用了多少元素。也许您应该返回一个同时包含
zero
z
的结构@Bodo我更改了代码,现在
zero
作为参数传递给函数
find_zeros()
,而
z
是输出,你认为它更好吗?如果
N
是一个全局常数,那么这个解决方案可能足以进行一次调用,但是当你想在调用者中重新分配缓冲区并在循环中调用
find_zero
时,你应该传递第一个空闲元素的地址和空闲元素的数量(如果不是全局
N
).仅供参考,malloc不会初始化分配的空间,因此内部可能有任何内容。如果您想分配和初始化空间,可以使用calloc,它的工作原理与malloc相同,但会用所有0初始化分配的空间。谢谢您的回答!我试着实现它,我正在接近一个解决方案。然而,我有两点意见:1)我不太明白
的用法有多少个
,你能解释一下它的作用吗?2) 通过这种方式,
find_zeros()
的所有输出将“堆叠”在
zero_列表中的一行中,而我希望它们“堆叠成行”。我的意思是我希望最后的
zero\u列表
数组继续