読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

ポインタと文字列、戻り値

c

追記:コメントを元に修正
ジャンケンゲーム - 素人がプログラミングを勉強するブログで、strcatが文字列を返せば楽なのにと書いたけど、ポインタを渡さなきゃいけない理由がわかった。

まず、文字列はプリミティブではないので、関数が文字列を返すときは配列(ポインタ)を返すことになる。同じアドレスを返すと共有されてしまうので、mallocを使うことになる。
で、それを使って、文字列をn個分つなげる関数fillを書くと、下のようになる。

#include <stdlib.h>

char *fill(int c, int n){
	char *str = malloc(sizeof(char) * (n + 1)); // '\0'が必要
	int i = n;
	while(i--){
		*(str + i) = c;
	}
	*(str + n) = '\0'; // str[n] = '\0' とどっちのほうがいいんだろう。
	return str;
}
int main(void){
	char *str = fill('*', 10);
	puts(str);
	free(str);
	return 0;
}

つまり、fillが確保したメモリを、自分でfreeしなければならなくなって、メモリリークをおこすミスが発生しやすくなる。

なので、関数を呼び出す側が自分でメモリを管理したほうが分かりやすい。

void fill(char *strp, char c, int n){
	int i = n;
	while(i--){
		*(strp + i) = c;
	}
	*(strp + n) = '\0';
}

int main(void){
	char str[11];
	fill(str, '*', 10);
	puts(str);
	return 0;
}