6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C言語の関数引数の紛らわしいところ

Last updated at Posted at 2014-04-07
#define MAX 10
void func(int n[MAX])
{
}

引数にこう書いても、要素数MAX以外の配列は受け付けないとかいうわけではなく、

int n[1];
func(n);

と書いてしまってもコンパイルできてしまう。
関数func内でn[3]とか[5]とか使おうとしていたら当然危険なコードになってしまう。

関数に渡す配列の要素数を指定したい場合は

struct data {
	int n[MAX];
};

void func(struct data *n)
{
}

と、構造体を作ってそのポインタを引数にするか、

typedef int data[MAX];

void func(data *n)
{
}

int main()
{
	data n;

	func(&n);

	return 0;
}

と、配列のポインタを渡すようにすれば関数に渡す配列の要素数を指定できる。
typedefしなくてもいけるけど

void func(int (*n)[MAX])
{
}

int main()
	int n1[MAX];
	int n2[1];

	func(&n1);
	func(&n2); //ここはコンパイルエラー

	return 0;
}

これはなんとなくわかりにくい気がする。

6
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?