回答編集履歴

3

コード例追加

2023/04/28 18:39

投稿

jimbe
jimbe

スコア12944

test CHANGED
@@ -3,3 +3,36 @@
3
3
  プログラマは「2件のデータが入った領域を大きくした」イメージでも、コンピュータからみれば2件のデータの入った領域の他に3件分の領域を確保しただけ(そして2件のデータの入っていた領域のポインタに上書きしているだけ)です。
4
4
  2件のデータを引き継いだ形にしたいのなら、2件のデータの領域は保持しておきコピーする等する必要があります。
5
5
  もしくは malloc では無く realloc の使用を検討してください。
6
+
7
+ **データをコピーする例**
8
+ ```c
9
+ case '3':
10
+ printf("3. データ追加\n");
11
+ kojin *newData = malloc((size + 1) * sizeof(kojin)); //新しい領域へのアドレスを一旦別の変数に保存
12
+ if(newData == NULL) {
13
+ printf("メモリの確保に失敗しました。\n");
14
+ break; //失敗したら後続の処理をしては行けないはず
15
+ }
16
+ if(data != NULL) { //古い領域があるならデータが入っているはず
17
+ memcpy(newData, data, size * sizeof(kojin)); //古い領域から新しい領域へデータをコピー
18
+ free(data); //古い領域を解放
19
+ }
20
+ data = newData; //新しい領域に書き換え
21
+ add_data(data, size);
22
+ size++;
23
+ break;
24
+ ```
25
+ **realloc の例**
26
+ ```c
27
+ case '3':
28
+ printf("3. データ追加\n");
29
+ kojin *reData = realloc(data, (size + 1) * sizeof(kojin)); //NULL の可能性があるため一旦別の変数に保存
30
+ if(reData == NULL) {
31
+ printf("メモリの確保に失敗しました。\n");
32
+ break; //失敗したら後続の処理をしては行けないはず
33
+ }
34
+ data = reData; //書き換え (新しい領域ならデータは realloc によってコピーされている)
35
+ add_data(data, size);
36
+ size++;
37
+ break;
38
+ ```

2

修正

2023/04/28 09:29

投稿

jimbe
jimbe

スコア12944

test CHANGED
@@ -1,5 +1,5 @@
1
1
  malloc は指定したサイズのメモリを(未使用のメモリから)確保します。
2
- 2件のデータが入った領域とは関係ありません。2件のデータが入った領域を示す変数に新たな領域のアドレスを入れていることも関係ありません。
2
+ 2件のデータが入った領域と3件のデータが入った領域は関係ありません。2件のデータが入った領域を示す変数に新たな領域のアドレスを入れていることも関係ありません。
3
3
  プログラマは「2件のデータが入った領域を大きくした」イメージでも、コンピュータからみれば2件のデータの入った領域の他に3件分の領域を確保しただけ(そして2件のデータの入っていた領域のポインタに上書きしているだけ)です。
4
4
  2件のデータを引き継いだ形にしたいのなら、2件のデータの領域は保持しておきコピーする等する必要があります。
5
5
  もしくは malloc では無く realloc の使用を検討してください。

1

修正

2023/04/28 09:28

投稿

jimbe
jimbe

スコア12944

test CHANGED
@@ -1,5 +1,5 @@
1
1
  malloc は指定したサイズのメモリを(未使用のメモリから)確保します。
2
- 2件のデータが入った領域とは関係ありません。
2
+ 2件のデータが入った領域とは関係ありません。2件のデータが入った領域を示す変数に新たな領域のアドレスを入れていることも関係ありません。
3
- プログラマは「2件のデータが入った領域を大きくした」イメージでも、コンピュータからみれば2件のデータの入った領域の他に3件分の領域を確保しただけです。
3
+ プログラマは「2件のデータが入った領域を大きくした」イメージでも、コンピュータからみれば2件のデータの入った領域の他に3件分の領域を確保しただけ(そして2件のデータの入っていた領域のポインタに上書きしているだけ)です。
4
- 2件のデータを引き継いだ形にしたいのなら、2件のデータコピーする等する必要があります。
4
+ 2件のデータを引き継いだ形にしたいのなら、2件のデータの領域は保持しておきコピーする等する必要があります。
5
5
  もしくは malloc では無く realloc の使用を検討してください。