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() しないとマズイでしょうか?