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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
ポインタを使って回文かどうか...
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
CStringからchar*への型変換に...
-
ポインタ配列
-
C言語にて構造体のメンバがNULL...
-
C言語:小文字を大文字に変換す...
-
strcat関数を自作したいです
-
char 文字列型 の表現範囲が-12...
-
C# ポインタ アクセス違反
-
new charとnew char[N]の違いは?
-
strcat関数
-
C++Builder 2009 テキスト...
-
36進数
-
[C] 構造体メンバーのカンマ区...
-
コマンドライン引数 *argv[]は...
-
DWORDとcharの変換
-
2次元配列の文字"列"の初期化方法
-
メモリを0クリアする方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
文字列str内の全ての数字を...
-
char 文字列型 の表現範囲が-12...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
文字列内の数字削除
-
c言語でポインタ変数を用いた配...
-
szとlpszの違い
おすすめ情報