動的なメモリ確保するmalloc関数で困ってるー。
コマンドライン引数を一つの文字列に結合するプログラムで、strcat関数を使わずに文字列2つを結合する関数を作ったんだけど、その中でmallocを使うとどうしても上手くfreeできない。
以下、悩み中のソース。コンパイルは通るんだけど、実行時にエラー出しちゃう……。
#include
#include
#include
/*文字列のサイズを調べるための関数*/
int size(const char *x){
int j;
for(j = 0; *(x + j) != '\0'; j++){}
return j;
}
char *concat(const char *a, const char *b){
char *s;/*返却用の文字列領域*/
char *sp;/*結合用の文字列領域*/
int i = 0;/*sの添え字*/
int length;/*サイズ用変数*/
/*aとbのサイズを調べ、合計を求める*/
length = size(a) + size(b);
/*メモリを確保する*/
sp = malloc(length + 1);
/*aの文字列を入れる*/
for(;*a != '\0'; a++){
*(sp + i) = *a;
i++;
}
/*続くようにbの文字列を入れる*/
for(;*b != '\0'; b++){
*(sp + i) = *b;
i++;
}
*(sp + i) = '\0';
/*文字列をコピーし、mallocした分を解放する*/
strcpy(s, sp);
free(sp);
/*文字列の先頭アドレスを返却*/
return s;
}
int main(int cnt, char *args[]){
/*コマンドライン引数がない場合、処理を行わない*/
if(cnt >= 2){
/*コマンドライン配列の0番目に『./a.exe』の./が自動的に入る為、0番目は使わない*/
char *new_str = args[1];
int i;
/*配列に格納されている文字列を、一つずつ結合していく*/
for(i = 2;i < cnt; i++){
new_str = concat(new_str, args[i]);
}
puts(new_str);
}
return 0;
}