说我分配了一个这样的数组:
char* array[]={"This"};
然后我想为array []分配一个新值,以便它存储“This”和“That”,有一种方法可以改变数组的大小,以便它可以保存一些新的值?
答案 0 :(得分:8)
不,您无法更改数组的大小。您可以根据需要使用动态分配的char*
列表和realloc()
:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
char** array = malloc(1 * sizeof(*array));
if (array)
{
array[0] = "This";
printf("%s\n------\n", array[0]);
char** tmp = realloc(array, 2 * sizeof(*array));
if (tmp)
{
array = tmp;
array[1] = "That";
printf("%s\n", array[0]);
printf("%s\n", array[1]);
}
free(array);
}
return 0;
}
参见在线演示:https://ideone.com/ng00k。
答案 1 :(得分:2)
无法调整数组大小。您只需创建一个大小为2的新数组,然后将前一个数据复制到新数组。 realloc
为您提供动态内存。更好的方法是使用LinkedLists
或Vectors
等数据结构,您可以在网上找到更多相关内容。
答案 2 :(得分:1)
您无法调整数组对象的大小。
您必须为array
动态分配内存并使用realloc
对其进行扩展。例如:
size_t current_size = 0;
char **array = malloc((current_size + 1) * sizeof *array);
if (array)
{
array[current_size++] = "This";
}
...
/**
* If realloc cannot extend the buffer, it will return NULL and leave
* the original buffer intact; however, if we assign NULL back to array,
* we lose our handle to the original buffer, causing a memory leak, so
* we assign the result to a temporary variable.
*/
char **tmp = realloc(array, (current_size + 1) * sizeof *array)
if (tmp)
{
array = tmp;
array[current_size++] = "That";
}
else
{
// realloc failed to extend the buffer; original buffer
// is left intact.
}
注意事项:
realloc
是一个相对昂贵的电话,所以你(通常)不想像我在这里一样扩展你的缓冲区一个元素。更常见的策略是选择覆盖大多数情况的初始起始大小,如果需要扩展缓冲区,则将其大小加倍。
您可以将调整大小操作抽象为单独的函数,如下所示:
int addItem(char ***arr, char *newElement, size_t *count, size_t *bufSize)
{
if (*count == *bufSize)
{
// we've run out of room; extend the buffer
char **tmp = realloc(**arr, 2 * *bufSize * sizeof **arr);
if (tmp)
{
*arr = tmp;
*bufSize *= 2;
}
else
{
// could not extend the buffer; return failure code
return 0;
}
}
(*arr)[(*count)++] = newElement;
}
并将其命名为
#define N ... // initial array size
char **array = malloc(N * sizeof *array);
size_t bufSize = N;
size_t count = 0;
...
if (addItem(&array, "This", &count, &bufSize))
printf("# elements = %zu, buffer size = %zu\n", count, bufSize);
if (addItem(&array, "That", &count, &bufSize))
printf("# elements = %zu, buffer size = %zu\n", count, bufSize);
这都是未经测试的,并且不在我的头顶;没有明示或暗示的保证。但它应该足以指出你正确的方向。
答案 3 :(得分:0)
这是不可能的。您可以分配一个char *数组,但是:
char **array = calloc(2, sizeof(char *));
array[0] = "This";
array[1] = "That";