北海道発 漆黒の渡り鳥 第2本拠

はてなダイアリーより移行しました。更新不定期です

(プログラミング)(C言語)mallocとfree

動的なメモリ確保する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;
}