私は文字列配列を持っています、
char *string_arr[] = { "Hi", "Hi2", "Hi3", "Hi4" };
「Hi5」のような別の要素を配列に挿入する必要があるため、メモリを配列に再割り当てする必要があります。どうやってやるの?
私は試した:
string_arr = realloc (.....);
しかし、それは機能しません。「割り当てに互換性のない型があります」というエラーが表示されます。
「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 (...);
...
-edrealloc
されていない配列は使用できません。malloc
コードには 2 つの問題があります。
1) 固定サイズの配列を realloc() しようとしています。realloc() は、malloc() を使用して割り当てられたメモリでのみ使用できます。
2) string_arr はポインタではなく配列です。配列は、式で右辺値として使用されるとポインターに縮退しますが、左辺値としては依然として異なるデータ型です。
文字列配列のメモリは、読み取り専用セクションに割り当てられます。
.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()
したがって、メモリを拡張する ために使用することはできません。
サイズ +1 の新しい配列を作成し、要素を初期配列から新しい配列に転送します。