回答編集履歴

3

リンク追加

2022/03/08 09:47

投稿

jimbe
jimbe

スコア12612

test CHANGED
@@ -3,6 +3,7 @@
3
3
  従いまして `tmp=res;` とした後に `free(tmp);` を実行したなら res の指すメモリ領域も解放されており、以降そのアドレスを用いることは破壊でしかありません。
4
4
  そして、 free に malloc したメモリ領域のアドレス(と NULL )以外を渡した時にどうなるかは…ご存じの通り、でしょうか。
5
5
  [ダングリングポインタとは|dangling pointerの危険性と回避](https://marycore.jp/coding/dangling-pointer/)
6
+ [MEM00-C. メモリの割り当てと解放は、同じ翻訳単位内の同一抽象レベルで行う](https://www.jpcert.or.jp/sc-rules/c-mem00-c.html)
6
7
 
7
8
  「1行をスペースで分割して個々の文字列への配列を得る」というのがメインのようですので、string 系関数を用いずに書いてみました。
8
9
  split は line を書き換えてその中にある文字列数を返し、

2

説明修正

2022/03/08 09:45

投稿

jimbe
jimbe

スコア12612

test CHANGED
@@ -1,6 +1,8 @@
1
1
  malloc は獲得したメモリ領域へのアドレスを返しますが、そのアドレスを入れた変数をコピーした所で新たなメモリ領域がさらに獲得されるわけではありません。単に同じメモリ領域を指す変数が増えただけです。
2
- また free に渡した(mallocによって獲得した)メモリ領域は、そこを指す変数が幾つ有ろうとも一回実行すれば放されます。(そこを指す全ての変数が無意味になります。)
2
+ また free に渡した(mallocによって獲得した)メモリ領域は、そこを指す変数が幾つ有ろうとも一回実行すれば放されます。(そこを指す全ての変数が無意味になります。)
3
- 従いまして `tmp=res;` とした後に `free(tmp);` を実行したなら res の指すメモリ領域も放されており、以降そのアドレスを用いることは破壊でしかありません。
3
+ 従いまして `tmp=res;` とした後に `free(tmp);` を実行したなら res の指すメモリ領域も放されており、以降そのアドレスを用いることは破壊でしかありません。
4
+ そして、 free に malloc したメモリ領域のアドレス(と NULL )以外を渡した時にどうなるかは…ご存じの通り、でしょうか。
5
+ [ダングリングポインタとは|dangling pointerの危険性と回避](https://marycore.jp/coding/dangling-pointer/)
4
6
 
5
7
  「1行をスペースで分割して個々の文字列への配列を得る」というのがメインのようですので、string 系関数を用いずに書いてみました。
6
8
  split は line を書き換えてその中にある文字列数を返し、

1

変数変更

2022/03/08 09:33

投稿

jimbe
jimbe

スコア12612

test CHANGED
@@ -43,9 +43,9 @@
43
43
 
44
44
  char *p = lbuf;
45
45
  for(int i=0; i<count; i++) while(*p++);
46
- length = p - lbuf;
46
+ int total = p - lbuf;
47
47
 
48
- char **buf = malloc(sizeof(char*)*(count+1) + length);
48
+ char **buf = malloc(sizeof(char*)*(count+1) + total);
49
49
  if(buf == NULL) {
50
50
  free(lbuf);
51
51
  return NULL;