让我们说我在C中有一个数组:
char *list[3] = {"Hello", "world", "!"};
我想扩展它。如果我把那个数组称为:
char **list = (char **) malloc(3 * sizeof(char *)); // Or sth. like that...
我可以调整它的大小:
realloc(list, 5 * sizeof(char *)); // Not sure now if I should use `char *` or `char **`
如果我试试这个:
char *list[3] = {"Hello", "world", "!"};
realloc(list, 5 * sizeof(char *)); // Not sure now if I should use `char *` or `char **`
它表示无法调整未分配的内存 好的,但是我怎么能像这样调整一个数组?
答案 0 :(得分:2)
你做不到。如果您有一个静态大小的数组,则根本无法更改其大小。如果您需要能够更改大小,请不要使用静态大小的数组。
PS:你不应该忽略realloc
的返回值。不能保证realloc
能够增长给定的内存块,因此它可能返回一个指向全新内存块的指针(释放旧内存)。因此,您应始终使用realloc
返回的指针,并且在调用realloc
后永远不要认为旧指针仍然有效。
答案 1 :(得分:0)
当您使用以下声明时:
char *list[3] = {"Hello", "world", "!"};
...编译器正在为您生成数组。但是malloc
并不了解它。您需要使用malloc
进行分配,然后将静态数组复制到动态区域中。只有这样才能使用realloc
更改其大小。
char *staticList[3] = {"Hello", "world", "!"};
// Allocate dynamically.
char **list = malloc(sizeof(staticList));
// Copy static array.
memcpy(list, staticList, sizeof(staticList));
// Change size to 5 entries.
list = realloc(list, 5 * sizeof(list[0]));
答案 2 :(得分:0)
简单的答案是,你做不到。您可以拥有固定大小的数组,也可以使用动态分配的数组,但不能将它们混合使用。
原因是在编译 1 时由编译器创建固定大小的数组。它只是留出了程序用来存储数组的一些内存。如果它是一个局部变量,那么内存位于堆栈中,如果它是一个全局变量,那么它就在全局数据空间中。像malloc
和realloc
这样的动态分配函数从不同的内存池分配,这些不同的内存池不兼容。
1 Variable-length arrays,或者它们不是 variable -length数组。编译器如何实现它们并不重要,它们仍然是“固定大小”的数组,一旦创建就无法重新分配。