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件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
sizeofというより引数がchar*な時点で関数には配列ではなく先頭アドレスしか渡っていません。
サイズ情報がないので関数内ではどうしようもないです。C言語には配列サイズを暗示的に関数に送る方法は存在しないので明示的に宣言するか、引数で渡す必要があります。
C++だとテンプレートを使えばできますが、目的の割に大掛かりなので普通に引数で渡した方が簡単かと思いますよ。
No.4
- 回答日時:
余談ですが C++1z (C++17?) では「コンテナの要素数を返すグローバルな関数」として
std::size
が導入される予定となっております. まあ配列に対する定義は #3 が参照しているのと全く同じ (というかいじりようもない) ですが.
No.3
- 回答日時:
sizeofはあくまで引数の型のサイズを返すので、Cでは関数化は無理そうですね
他の方の言うように、素直に呼び出し元で使うか、char型以外でも配列の長さを取得したいなら、
・Cでもマクロ化すれば、関数っぽく使える
・C++ならテンプレートにする
という方法があります
googleってみたら、
http://www.techscore.com/blog/2013/02/08/how-to- …
にどちらも記載が有ります
No.1
- 回答日時:
>この式だと恐らく関数function内のsizeはchar型のポインタのサイズ4バイト(環境によって違いますが)になると思うんですが、この考えであってますか?
sizeof(*data)の値は1です。(sizeof(char))・・・と同義
sizeof(data)の値は4です。(sizeof(char*))・・・と同義
>このポインタが指すchar型配列(char moji[36])のサイズ36バイトを関数function内で取得したい場合はどうしたらいいでしょうか?なんかいい関数はありますか?
残念ながらありません。呼び出し側で、sizeof(moji)として36を取得するしかありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char型にint型の数値を代入する。
-
メモリ関連のエラーを取り除く...
-
c言語でポインタ変数を用いた配...
-
ポインタ
-
C言語のchar型配列を計算させる...
-
レコード件数、レコード長の分...
-
文字列の連結
-
ASCIIコードへの変換方法
-
関数について
-
fstream型オブジェクトを関数の...
-
C言語 配列の長さの上限
-
malloc呼び出し時のセグメンテ...
-
関数から配列を返すには?
-
C++のnewで確保したメモリーの...
-
Run-Time Check Failure #3とい...
-
プログラムによく出てくるst...
-
C言語でファイルの中身をソー...
-
配列の要素数に変数を入れたい...
-
LoadLibraryでAccess Violation...
-
init関数の意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
char型にint型の数値を代入する。
-
const char* s1とただのchar s1...
-
new charとnew char[N]の違いは?
-
動的メモリの初期化方法について。
-
エクセルのMID関数は、C言語では?
-
C言語 strstrの実装
-
SetWindowTextについて。
-
char 文字列型 の表現範囲が-12...
-
文字列の途中から途中までを抽出
-
2次元配列の文字"列"の初期化方法
-
DWORDとcharの変換
-
C++17で、unsigned char * 配列...
-
C言語の文字リテラル中の16進文...
-
strcat関数を自作したいです
おすすめ情報