電子書籍の厳選無料作品が豊富!

どうもこんにちは。
C言語でプログラムを作成しています。

ある関数に配列を渡すことを考えていますが、渡した配列の要素数を取得する方法は何かありますか?

標準の関数を見ても、配列の先頭アドレスのポインタとともに、配列の要素数を渡しているものばかりで、配列のポインタを渡しているものは見かけません。
要素数があらかじめわかっていれば、それを引数の型に指定できますが、呼び出されるまで不明な場合はうまくいきません。

配列の要素数も引数として一緒に渡す必要がありますか?


[作ってみたサンプル]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// func1 と func2 をまとめられないだろうか。。。
void func1(int (*p)[10])
{
________int n = sizeof(*p) / sizeof((*p)[0]);
________int i;

________for (i = 0; i < n; i++) {
________________printf("%d\n", (*p)[i]);
________}
________printf("\n");
}

void func2(int (*p)[5])
{
________int n = sizeof(*p) / sizeof((*p)[0]);
________int i;

________for (i = 0; i < n; i++) {
________________printf("%d\n", (*p)[i]);
________}
________printf("\n");
}

int main(int argc, char *argv[])
{
________int ary1[10] = { 2, 4, 6, 8, 0, 1, 3, 5, 7, 9 };
________int ary2[5] = { 3, 6, 9, 12, 15 };

________func1(&ary1);
________func2(&ary2);

________return 0;
}

A 回答 (4件)

Java では「配列はオブジェクト」で実行時にも自分の大きさを保持していますが, C/C++ では「配列の大きさ」はコンパイル時ま

でしか保持されません. 実行時には「自分の大きさ」を知らないのでどうしようもないはずです.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

やはりどうしようもないのですね。
素直に他の実装にならい、引数に要素数をつけることにします。
配列のポインタを使用している関数も見ないですし。

お礼日時:2008/08/20 16:16

与えられる引数の型がある程度決まっているなら配列はvoid*で渡して


switchなどで型を分岐させるというのはどうでしょうか。
(要素数はやはり別途引数で渡す必要があります)

単なる思いつきで実際にやってもいないのでうまくいくかどうかも
分かりませんが(外していたらすみません)。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

要素数はやはり別に渡す必要がありそうですね。
なかなかうまくいかないものです。

お礼日時:2008/08/20 12:11

標準関数で「配列のポインタを渡す」ものってあったっけ?


C においては「何らかの形で『最後』の位置を与える」ことが必須だったはず. 方法としては
・要素数を与える (memcpy など)
・「最後」の要素のあとに「特殊」な値を入れる (str系)
くらいかな.
C++ なら参照と template でなんとでもなるんだけど....
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

確かに要素数を与えるだけでなく、文字列などは特殊な値を終了として扱っていますね。
Java なら渡された配列から要素数を取得することができますが、Cだと難しいようですね。。。

お礼日時:2008/08/20 12:10

参考にした標準の関数がなにかわからないが、


適当でないものを参考にしてるかも。


> 配列の要素数も引数として一緒に渡す必要がありますか?
要素数を渡すのが一般的だと思います。


#ifndef _countof
#define_countof(a)(sizeof(a)/sizeof((a)[0]))
#endif

void func(int *p, int size)
{
__for (i = 0; i < n; i++) {
____printf("%d\n", *(p+i) );
__}
}


int main(int argc, char *argv[])
{
__int ary1[10] = { 2, 4, 6, 8, 0, 1, 3, 5, 7, 9 };
__int ary2[5] = { 3, 6, 9, 12, 15 };

__func(ary1, _countof(ary1));
__func(ary2, _countof(ary2));

__return 0;
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

私も要素数を一緒に渡すのが一般的だと思っています。
要素数を渡さないで、要素数を知ることが可能なのか調べています。

お礼日時:2008/08/20 12:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!