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

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

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

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

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

2919閲覧

スタック領域の順番が同じになってしまいます。

strike1217

総合スコア651

C

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

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2016/11/24 05:53

C言語で
とある自作関数内に以下のローカル変数を宣言しました。
int auto_flag = 0;
char buffer[16];

これを逆の順番で宣言したら、スタック領域内にPUSHされる順番も変わりますよね?

char buffer[16];
int auto_flag = 0;

と逆順に宣言してgdbで
x64xw $rsp

とやって中身を覗いたら、PUSHされている順番が逆になっていなかったのです!

最初の中身
(gdb) x/x &auto_flag
0x7fffffffe62c: 0x00
(gdb) x/s buffer
0x7fffffffe610: "\260\a@"

auto_flag → bufferとなっていますよね・・・

逆順の中身
(gdb) x/s buffer
0x7fffffffe620: "\260\a@"
(gdb) x/x &auto_flag
0x7fffffffe63c: 0x00

auto_flag → buffer となっています・・・・

PUSHされる順番が逆になっていません。
最適化した時としない時でみてみたのですが、かわりませんでした。
なぜでしょうか?

Linux 64bit です。

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

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

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

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

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

guest

回答2

0

独立した変数領域をスタック上にどの順序で割り当てるかは、完全にCコンパイラの自由となります。C言語仕様では規定しませんし、ABIでも関数内でのスタック利用について何も規定しません。

メモリレイアウトについて規定があるのは:

  • 配列型の変数について、その要素順とメモリアドレス順序が一致すること。(要素間に"隙間"は存在しない)
  • 構造体型の変数について、そのメンバ変数宣言順序とメモリアドレス順序が一致すること。(ただしメンバ変数同士が連続配置される保証はない/パディングが存在するかもしれない)

投稿2016/11/24 06:25

編集2020/09/01 09:38
yohhoy

総合スコア6191

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

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

strike1217

2016/11/24 07:31

Cコンパイラの自由で、特に決まっていないのですね! ありがとうございます!
guest

0

ベストアンサー

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11120139976
こちらのやりとりが参考になります。

追記: 構造体についての記載に誤りがあります。
構造体の中身の順序は規格上保証されています。
参考文献: http://portable-c.jugem.jp/?eid=17

投稿2016/11/24 05:56

編集2016/11/24 06:05
majiponi

総合スコア1720

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

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

strike1217

2016/11/24 06:23

ありがとうございます! 見てみますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問