4

それで、私は奇妙な任務を受けました。ファイルの内容を配列文字列に読み取る必要があります。ただし、次のように配列を初期化する必要があります (配列サイズ 1 として初期化する必要があります)。

char **input = (char **)malloc(1*sizeof(char*))

それ以外の

char **input = (char **)malloc((sizeOfFile+1)*sizeof(char*))

したがって、realloc を使用し続ける必要があります。私の質問は、内側の配列 (文字列) を再割り当てする方法と、外側の配列 (文字列の配列) を再割り当てする方法です。

4

2 に答える 2

7

「内部配列」を再割り当てする必要はありません。割り当てたメモリの内容はポインタであり、再割り当てするときは、指す場所の内容ではなく、ポインタinputのみを再割り当てします。inputinput


それがどのように機能するかを示す粗い ASCII イメージ:

最初に、配列に単一のエントリを割り当てると、input次のようになります。

         +----------+    +---------------------------+
input -> | input[0] | -> | What `input[0]` points to |
         +----------+    +---------------------------+

2 番目のエントリの場所を確保するために再割り当てした後 (つまりinput = realloc(input, 2 * sizeof(char*));)

         +----------+    +---------------------------+
input -> | input[0] | -> | What `input[0]` points to |
         +----------+    +---------------------------+
         | input[1] | -> | What `input[1]` points to |
         +----------+    +---------------------------+

内容、つまりinput[0]、再割り当て前と同じです。変更されるのは実際のinputポインタだけです。

于 2013-02-22T20:04:58.673 に答える
1

あなたのchar**(つまり、へのポインタへのポインタchar)は、メモリも指すポインタの配列です。したがって、一連のchar*ポインタにメモリを割り当てる必要があるだけでなく、これらの各ポインタが指すメモリ(一部の文字が格納されるメモリ)も割り当てる必要があります。

const int ARR_SIZE = 10;
const int STR_SIZE = 20;

char** strArr = malloc(ARR_SIZE * sizeof(char*));
for (int i = 0; i < ARR_SIZE; ++i)
    strArr[i] = malloc(STR_SIZE * sizeof(char));

strArr[9] = "Hello";

strArr = realloc(strArr, (ARR_SIZE + 5) * sizeof(char*));
for (int i = 0; i < 5; ++i)
    strArr[ARR_SIZE + i] = malloc(STR_SIZE * sizeof(char));

strArr[14] = "world!";

printf("%s %s", strArr[9], strArr[14]);

完全な例はここにあります。お役に立てれば :)

于 2013-02-22T20:19:34.403 に答える