malloc関数(strtok関数の自作版)につきまして分からないこと
malloc関数(strtok関数の自作版)につきまして分からないことがあります。
以下のプログラムにmallo関数がフリーする最適な位置を明示しなさいといわれました。
文字が分離した時にfreeすると助言されたのですが
いまいち理解できません・・・。
条件式の中で使用するともいわれていました。(おそらくif文・・・。)
色んな意見を参考にしたいので詳しい方助言のほうよろしくおねがいします。
なおプログラムはほかの箇所を変更したり、他の場所でもmalloc関数を使用することが認められています。
またfreeする場所はメイン関数ではなくあくまでもstrtok関数の中で宣言するようです。
よろしくお願いします。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
main(){
char* s2 = ",/";
char* result;
char* r1;
char* r2;
char* r3;
char* r4;
result = strtok("//123//,45/,678,9/","/,");
r1 = strtok(NULL, s2);
r2 = strtok(NULL, s2);
r3 = strtok(NULL, s2);
r4 = strtok(NULL, s2);
printf("%s\n",result);
printf("%s\n",r1);
printf("%s\n",r2);
printf("%s\n",r3);
printf("%s\n",r4);
return;
}
char *strtok(char *s1, const char *s2)
{
int i,len;
char *str1, *str2 , *str3;
static char *tok ;
static char* mstr;
if(s1 != NULL) {
str1 = s1;
}
else {
str1 = tok;
}
str2 = str1 + strspn(str1, s2); /* strspnを利用 */
if (*str2 == '\0') {
return (NULL);
}
len = 1;
i = 0;
while(*(str2 + i) != '\0'){
len++;
i++;
}
mstr = (char*)malloc(sizeof(char)*len);
if(mstr == (NULL)) {
return 0;
}
i = 0;
while(*(str2 + i) != '\0'){
*(mstr + i) = *(str2 + i );
i++;
}
*(mstr + i ) = '\0';
str3 = mstr + strcspn(mstr, s2); /* strcspnを利用 */
if (*str3 != '\0'){
*str3 = '\0';
str3 = str3 + 1;
}
tok = str3;
return (mstr);
}
お礼
回答ありがとうございます。 変数が保持されているのですね。