我在C应用程序中有一个固定大小的char数组。我将该数组传递给某个函数,然后我将它传递给多个函数。这样就可以根据某些条件填充某些函数。因为我发送一个固定大小的数组,所以当我将数据复制到它时,如果大小超过数组大小,我就会遇到问题。我知道我必须使char数组动态,但正如我所说,数组被填充多个函数,大小将不同。那么我需要在数组填充的地方动态分配数组吗?考虑到数组被30多个不同的函数填充。或者有没有办法进行最小的修改?
答案 0 :(得分:3)
正如你的问题标题C
,IMO最好的方法是在main()
函数中对特定变量类型的指针进行十分转换,传递该指针的地址[基本上是一个双指针] ]到其他函数并动态分配内存。
您可以继续将指针传递给所有其他函数。在每个被调用的函数中,测量[从该特定函数]放置数据所需的内存量,并使用realloc()
来增加可用内存。
如UncleO所述,所需的指针应该是指向数组的指针 [即双指针]
修改
答案 1 :(得分:0)
你没有将数组传递给C中的函数,尽管它看起来是这样的。传递的是指向数组第一个元素的指针。指针按值传递。也就是说,指针的值(存储位置)被复制到局部变量中。可以使用此局部变量更改数组的内容。
如果对此局部变量使用malloc()
或realloc()
,那么"传入的指针"不会受到影响。 realloc()
可以调整内存大小,但它也可以释放内存并为本地变量分配一些新内存。
如果要更改数组指针,则应传入指向指针的指针。指针指向的是改变了什么。这有点麻烦。但是这样你可以分配更多的内存。
#include <stdlib.h>
char* arr;
void changeit(char** arrptr)
{
*arrptr = realloc(*arrptr, 20*sizeof(char));
}
void main (void)
{
arr = malloc(10*sizeof(char));
changeit(&arr);
}
答案 2 :(得分:0)
要使用不改变数组的函数,请传递数组地址和大小。
int foo1(const char *array, size_t size, ...)
对于不改变数组大小的每个函数,传递数组地址和数组大小
int foo2(char *array, size_t size, ...)
对于可能改变数组大小的函数,传递数组地址的地址和大小的地址。
int foo3(char **array, size_t *size, ...)
代码可以将这两个变量放在一起
typedef struct {
size_t size;
char array;
} YetAnotherArrayType;
答案 3 :(得分:0)
Chux,
你帖子的结尾有一点错字。我想你的意思是:
typedef struct {
size_t size;
char* array;
} YetAnotherArrayType;
你没有使数组成为指针类型。
如果海报是手工制作容器,那么经典的解决方案是跟踪size
和capacity
。
在该模型中,您将数组分配给某个初始值capacity
并将size
设置为0.然后跟踪其总体数量,使其每次填满时会增加一些块大小或因子。
频繁的重新分配可能会造成巨大的性能损失,并且通过相关程序的声音,这种行为似乎很可能。