展开非指针数组

时间:2016-04-25 13:15:17

标签: c arrays

让我们说我在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 **`

它表示无法调整未分配的内存 好的,但是我怎么能像这样调整一个数组?

3 个答案:

答案 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 时由编译器创建固定大小的数组。它只是留出了程序用来存储数组的一些内存。如果它是一个局部变量,那么内存位于堆栈中,如果它是一个全局变量,那么它就在全局数据空间中。像mallocrealloc这样的动态分配函数从不同的内存池分配,这些不同的内存池不兼容。

编译时编译器未分配

1 Variable-length arrays,或者它们不是 variable -length数组。编译器如何实现它们并不重要,它们仍然是“固定大小”的数组,一旦创建就无法重新分配。