質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1441閲覧

C言語でBufferのpointerをsizeof()した時の返り値が違う問題

ParaParaDance

総合スコア56

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2020/09/18 08:47

編集2020/09/18 09:14

前提・実現したいこと

ARM32BitのCPUにC言語の直書きしています。

メンバーのTypeが異なる構造体があり、構造体の先頭メンバーのAddressを取得したうえ、
sizeof(メンバーaddress)でメンバーTypeの大きさを取得し、Address + sizeというふうにpointerを増やしながらBufferを書き換えしようとします。

しかし、sizeof(address)でメンバーのおおきさを得ようとすると全て4byteが返ってきます。もちろん、sizeof(メンバー名)を入れたら正しいbyte値が返ってきます。

どうしてでしょうか。
sizeof()にaddressを当ててtype sizeを得るためにはどうすればよいでしょうか。
sizeofではなくても他の良い方法があればアドバイスください。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

typedef struct{
uint8_t mem_a;
uint16_t mem_b;
}buffer;

uint8_t * pntbuff;
uint8_t * pntbuff2;
uint8_t size;

pntbuff = (uint8_t*)&buffer.mem_a; //mem_aのAddressを取得
*pntbuff = 100;
size = sizeof(pntbuff); //mem_aのtype sizeを取得、しかし1byteではなく4byteが得られる
pntbuff2 = pntbuff+size; //addressの増加
*pntbuff2 = 200; // 4byte前へ飛んでしまう。     

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hidezzz

2020/09/18 08:54

問題点をソースコードの形で提示することは出来ますか? ぱっと見は、sizeof(address)→sizeof(*address)にするというようなことなのかなって気がしました。
ParaParaDance

2020/09/18 09:15

ソースの例題を追記しました。
ParaParaDance

2020/09/18 09:24

sizeof(*address)にすると、今回は常に1しか返ってこないですね。
Y.H.

2020/09/18 09:37

pntbuff は uint8_t * なので、sizeof(*pntbuff) は1byteで合ってますよ。*pntbuffはuint8_t型なので。
Y.H.

2020/09/18 09:38

質問記載の構造体の場合、パディングが発生しないですか? sizeof(buffer) とした場合の、質問者さんの考えてられる結果値と、実際にsizeof(buffer)を実行した場合に得られた結果値を質問に記載できますか? 「C言語 構造体 アライメント パディング」などで検索してみてください。 構造体のメンバーに配列が含まれない、かつ、アライメントによるパディングが発生しないという 特殊な場合においてはsizeof(*address)でメンバーのサイズが取得でき 且つ、そのアドレスを「pntbuff2 = pntbuff+size; //addressの増加」で加算し次メンバーの先頭アドレスの取得が可能です。
guest

回答2

0

ベストアンサー

しかし、sizeof(address)でメンバーのおおきさを得ようとすると全て4byteが返ってきます。

はい、sizeof(address)ポインタのサイズを返します。

sizeof()にaddressを当ててtype sizeを得るためにはどうすればよいでしょうか。

残念ながら、そのような方法はありません。C言語では、動的に確保したメモリのサイズは自分で管理するほかありません。

投稿2020/09/18 09:04

maisumakun

総合スコア145199

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/09/18 12:57

「構造体のオフセットを求めたい」ということでしたら、offsetofのようなマクロが処理系によっては用意してあります。
guest

0

sizeof は、配列や構造体を入れると、それが占めるバイト数を返します
ポインタを入れると、ポインタのサイズを返します。

それだけの話しですね

投稿2020/09/18 08:52

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問