C言語で、free()できません
解決したいこと
今、「与えた文字列をセパレータで分割して、配列を返す関数」を作っています。
JSの split() みたいなやつです。
しかし、上手く free() できずに困っています。
発生している問題・エラー
// 文字列 str を sep で分割して配列にして返します
char** split(char str[], const char sep[], int len) {
// 元の配列を傷つけたくないので、新しい文字列にコピーして処理する
char* str2 = (char*)malloc(len);
strcpy_s(str2, len, str);
// 処理の結果を入れる
char** res = (char**)malloc(len);
char* ctx;
char* token = strtok_s(str2, (char*)sep, &ctx);
int i = 0;
while (token != NULL) {
res[i] = token;
token = strtok_s(NULL, sep, &ctx);
i++;
}
// free() したらバグる・・・
//free(str2);
return res;
}
int main() {
char s[] = "aa,bbbbb,ccccc";
int len = sizeof(s) / sizeof(s[0]);
char** r = split(s, ",", len); // 上で定義した関数です
// きちんと r に値が入っているか確認
for (int i = 0; i < 3; ++i) {
printf("%s\n", r[i]);
}
printf("元の文字列%s", s); // 元の文字列が傷ついてないか
return 0;
}
新しい配列の宣言時に、サイズが固定されているとマズイので malloc() してます。
return で出来上がった配列を戻しているのは、これ以上引数を増やしたくないからです(あとJSのsplit()に似せるため)
これって、関数が終わったら str2 と res は free() されてるんですか?
それともポインタ変数のみが破棄されてるんですか?
関数内で確保した動的メモリも free() しないとマズイでしょうか?