次のように配列を割り当てたとします。
char* array[]={"This"};
その後、「これ」と「あれ」を格納するために array[ ] に新しい値を割り当てたいと思いました。新しい値を保持できるように配列のサイズを変更する方法はありますか?
いいえ、配列のサイズを変更することはできません。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 .
配列のサイズを変更する方法はありません。サイズ 2 の新しい配列を作成し、すべてのデータを前の配列から新しい配列にコピーするだけです。 realloc
動的メモリでそれを行います。より良い方法は、オンラインで詳細を見つけることができるLinkedLists
またはなどのデータ構造を使用することです。Vectors
配列オブジェクトのサイズは変更できません。
にメモリを動的に割り当て、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
は比較的高価な呼び出しであるため、(一般的に) ここで行ったように一度に 1 要素ずつバッファーを拡張したくないでしょう。より一般的な戦略は、ほとんどのケースをカバーする初期開始サイズを選択し、バッファーを拡張する必要がある場合はそのサイズを 2 倍にすることです。
次のように、サイズ変更操作を別の関数に抽象化できます。
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);
これはすべてテストされておらず、私の頭の上から外れています。明示または黙示の保証はありません。しかし、正しい方向に向けるには十分なはずです。
これは不可能です。ただし、char* の配列を割り当てることができます。
char **array = calloc(2, sizeof(char *));
array[0] = "This";
array[1] = "That";