1

私は文字列配列を持っています、

char *string_arr[] = {     "Hi",  "Hi2", "Hi3", "Hi4"    };

「Hi5」のような別の要素を配列に挿入する必要があるため、メモリを配列に再割り当てする必要があります。どうやってやるの?

私は試した:

string_arr = realloc (.....); 

しかし、それは機能しません。「割り当てに互換性のない型があります」というエラーが表示されます。

4

5 に答える 5

4

「malloc()」から取得したメモリへのポインタは「realloc()」のみです。

char **string_arr;

int nelms = 10;
string_array = (char **)malloc (sizeof (char *) * nelms);
if (!string_array) {
  perror ("malloc failed");
  return;
}

string_array[0] = strdup ("Hi");
string_array[1] = strdup ("Hi2");
string_array[2] = strdup ("Hi3");
string_array[3] = strdup ( "Hi4");
...
string_array = realloc (...);
...
于 2012-07-18T17:38:42.907 に答える
3

-edreallocされていない配列は使用できません。malloc

于 2012-07-18T17:39:04.277 に答える
3

コードには 2 つの問題があります。

1) 固定サイズの配列を realloc() しようとしています。realloc() は、malloc() を使用して割り当てられたメモリでのみ使用できます。

2) string_arr はポインタではなく配列です。配列は、式で右辺値として使用されるとポインターに縮退しますが、左辺値としては依然として異なるデータ型です。

于 2012-07-18T17:41:41.470 に答える
2

文字列配列のメモリは、読み取り専用セクションに割り当てられます。

      .section        .rodata
    .LC0:
            .string "Hi"
    .LC1:
            .string "Hi2"
    .LC2:
            .string "Hi3"
    .LC3:
            .string "Hi4"
            .text
    .globl main
            .type   main, @function
    main:
            pushl   %ebp
            movl    %esp, %ebp
            subl    $16, %esp
            movl    $.LC0, -16(%ebp)
            movl    $.LC1, -12(%ebp)
.....
.....


ヒープではありません。realloc()したがって、メモリを拡張する ために使用することはできません。

于 2012-07-18T18:04:58.033 に答える
0

サイズ +1 の新しい配列を作成し、要素を初期配列から新しい配列に転送します。

于 2012-07-18T17:40:06.417 に答える