在C中将固定大小的数组更改为动态

时间:2014-11-14 05:58:50

标签: c arrays dynamic-allocation

我在C应用程序中有一个固定大小的char数组。我将该数组传递给某个函数,然后我将它传递给多个函数。这样就可以根据某些条件填充某些函数。因为我发送一个固定大小的数组,所以当我将数据复制到它时,如果大小超过数组大小,我就会遇到问题。我知道我必须使char数组动态,但正如我所说,数组被填充多个函数,大小将不同。那么我需要在数组填充的地方动态分配数组吗?考虑到数组被30多个不同的函数填充。或者有没有办法进行最小的修改?

4 个答案:

答案 0 :(得分:3)

正如你的问题标题C,IMO最好的方法是在main()函数中对特定变量类型的指针进行十分转换,传递该指针的地址[基本上是一个双指针] ]到其他函数并动态分配内存。

您可以继续将指针传递给所有其他函数。在每个被调用的函数中,测量[从该特定函数]放置数据所需的内存量,并使用realloc()来增加可用内存。

如UncleO所述,所需的指针应该是指向数组的指针 [即双指针]

修改


  1. 首次为该指针分配内存时,您可以使用malloc()calloc()

  2. 从下次开始,扩展 [调整大小]内存量,您需要使用realloc()

答案 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;

你没有使数组成为指针类型。

如果海报是手工制作容器,那么经典的解决方案是跟踪sizecapacity。 在该模型中,您将数组分配给某个初始值capacity并将size设置为0.然后跟踪其总体数量,使其每次填满时会增加一些块大小或因子。 频繁的重新分配可能会造成巨大的性能损失,并且通过相关程序的声音,这种行为似乎很可能。