5

次のように配列を割り当てたとします。

char* array[]={"This"};

その後、「これ」と「あれ」を格納するために array[ ] に新しい値を割り当てたいと思いました。新しい値を保持できるように配列のサイズを変更する方法はありますか?

4

4 に答える 4

14

いいえ、配列のサイズを変更することはできません。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 .

于 2012-10-16T15:06:37.507 に答える
4

配列のサイズを変更する方法はありません。サイズ 2 の新しい配列を作成し、すべてのデータを前の配列から新しい配列にコピーするだけです。 realloc動的メモリでそれを行います。より良い方法は、オンラインで詳細を見つけることができるLinkedListsまたはなどのデータ構造を使用することです。Vectors

于 2012-10-16T15:07:28.243 に答える
2

配列オブジェクトのサイズは変更できません。

にメモリを動的に割り当て、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);

これはすべてテストされておらず、私の頭の上から外れています。明示または黙示の保証はありません。しかし、正しい方向に向けるには十分なはずです。

于 2012-10-16T15:48:29.067 に答える
0

これは不可能です。ただし、char* の配列を割り当てることができます。

char **array = calloc(2, sizeof(char *));
array[0] = "This";
array[1] = "That";
于 2012-10-16T15:11:02.967 に答える