dポイントプレゼントキャンペーン実施中!

C,C++のsizeof演算子の仕様について。

int main(void)
{
char moji[36];
function(&moji);
}

void function(char *data)
{
int size = sizeof(*data);
}
このような処理があったとしまして、この式だと恐らく関数function内のsizeはchar型のポインタのサイズ4バイト(環境によって違いますが)になると思うんですが、この考えであってますか?
ではこのような処理の場合に、このポインタが指すchar型配列(char moji[36])のサイズ36バイトを関数function内で取得したい場合はどうしたらいいでしょうか?なんかいい関数はありますか?
しょーもない質問ですいません。

A 回答 (5件)

sizeofというより引数がchar*な時点で関数には配列ではなく先頭アドレスしか渡っていません。

サイズ情報がないので関数内ではどうしようもないです。
C言語には配列サイズを暗示的に関数に送る方法は存在しないので明示的に宣言するか、引数で渡す必要があります。
C++だとテンプレートを使えばできますが、目的の割に大掛かりなので普通に引数で渡した方が簡単かと思いますよ。
    • good
    • 0

余談ですが C++1z (C++17?) では「コンテナの要素数を返すグローバルな関数」として


std::size
が導入される予定となっております. まあ配列に対する定義は #3 が参照しているのと全く同じ (というかいじりようもない) ですが.
    • good
    • 0

sizeofはあくまで引数の型のサイズを返すので、Cでは関数化は無理そうですね


他の方の言うように、素直に呼び出し元で使うか、char型以外でも配列の長さを取得したいなら、
・Cでもマクロ化すれば、関数っぽく使える
・C++ならテンプレートにする
という方法があります
googleってみたら、
http://www.techscore.com/blog/2013/02/08/how-to- …
にどちらも記載が有ります
    • good
    • 0
この回答へのお礼

よくわかりました。わざわざ調べていただき恐縮です...

お礼日時:2016/12/03 10:48

いちおう突っ込んでおくと, これ function の呼び出しで型があってないよね....



function(&moji) で呼び出したければ関数は
void function(char (*data)[36])
ではじめなきゃならないし, そうなっているなら
sizeof *data
で 36 という数字が得られる.
    • good
    • 0
この回答へのお礼

無知でお見苦しいところお見せしてしまい申し訳ありません。ご回答ありがとうございました。

お礼日時:2016/12/03 10:44

>この式だと恐らく関数function内のsizeはchar型のポインタのサイズ4バイト(環境によって違いますが)になると思うんですが、この考えであってますか?



sizeof(*data)の値は1です。(sizeof(char))・・・と同義
sizeof(data)の値は4です。(sizeof(char*))・・・と同義

>このポインタが指すchar型配列(char moji[36])のサイズ36バイトを関数function内で取得したい場合はどうしたらいいでしょうか?なんかいい関数はありますか?

残念ながらありません。呼び出し側で、sizeof(moji)として36を取得するしかありません。
    • good
    • 0
この回答へのお礼

無知で申し訳ありません。ご回答参考にさせていただきます。

お礼日時:2016/12/03 10:43

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