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

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

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

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

Q&A

解決済

6回答

596閲覧

メモリの割り当てについて 自己参照構造体

masuter0413

総合スコア50

C

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

0グッド

0クリップ

投稿2018/10/29 08:47

以下のコードを実行してメモリがどこに置かれているのか確認してみました。nextは全く違う領域にあるという事でしょうか。

c

1#include<stdio.h> 2#include<stdlib.h> 3 4struct LIST { 5 struct LIST*next; 6 int body; 7}; 8int main() { 9 struct LIST list; 10 struct LIST*p = &list; 11 printf("構造体のアドレスは%p\n", p); 12 printf("nextのアドレスは%p\n", p->next); 13 printf("構造体メンバbodyのアドレスは%p\n",&( p->body)); 14 return 0; 15}

実行結果

c

1構造体のアドレスは003AFAA0 2nextのアドレスはCCCCCCCC 3構造体メンバbodyのアドレスは003AFAA4 4続行するには何かキーを押してください . . .

bodyが4バイトなのはわかるんですが、結局この構造体のメモリの容量は何バイトなのでしょうか。

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

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

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

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

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

guest

回答6

0

まず、「構造体のメモリの容量」がどういう意味なのか、はっきりするところから始めないといけないかもしれません。

sizeofで計るようなサイズの場合、ポインタ自体のデータ容量はカウントされますが、ポインタの指した先は考慮の対象外です。

投稿2018/10/29 09:05

maisumakun

総合スコア145184

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

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

退会済みユーザー

退会済みユーザー

2018/10/29 09:42

sizeofでサイズを計る場合、....うんぬんかんぬん という書き出しのほうがいいかな?と思いましたがどうでしょう…?
guest

0

バイト数を調べるのであればsizeof()をお使いください。

投稿2018/10/29 08:51

dice142

総合スコア5158

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

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

0

next は初期化されてません。
ローカル変数なので不定値が入ってるだけです

投稿2018/10/29 08:49

y_waiwai

総合スコア87774

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

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

maisumakun

2018/10/29 12:19

0xCCCCCCCCってことは、MSVCなどのデバッグモードで、わざと無効な値を埋めてあるようですね。
guest

0

ほとんど、質問に近いのですが、

bodyが4バイトなのはわかる

何を元に判断したのでしょうか?

構造体のアドレスは003AFAA0

と、

構造体メンバbodyのアドレスは003AFAA4

でしょうか? ここから、分かるのは、構造体の先頭アドレスと bodyの先頭アドレスの差で、bodyのサイズは不明です。 ...と言っても、まあ、intなんで、4byteとは思いますが。

nextは全く違う領域にあるという事でしょうか。

これは、y_waiwaiさんの回答にあるように、初期化されていないので、不定です。(システムによっては同じだったり、するかもですが)

なお、構造体のサイズは、

C

1printf("LIST のサイズは%d\n", sizeof (struct LIST));

としたところ、手元のPCでは、 8 となりました。

投稿2018/10/29 12:15

pepperleaf

総合スコア6383

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

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

0

ベストアンサー

以下のコードを実行してメモリがどこに置かれているのか確認してみました。
nextは全く違う領域にあるという事でしょうか。

他の方の回答にありますように, 初期化されていないアドレスが指定されているだけです.

bodyが4バイトなのはわかるんですが、
結局この構造体のメモリの容量は何バイトなのでしょうか。

intstrcut LIST *(ポインタ) は実行するPC環境によって異なるので
質問されている構造体のサイズについて, これだと言える数値は答えられません.
なので, sizeof() を使用してサイズを確認してください.

投稿2018/11/01 08:39

Livenga

総合スコア85

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

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

0

以下のコードを実行してメモリがどこに置かれているのか確認してみました。nextは全く違う領域にあるという事でしょうか。
nextのアドレスはCCCCCCCC

これは、単に初期化されていないだけです。

bodyが4バイトなのはわかるんですが、結局この構造体のメモリの容量は何バイトなのでしょうか。

実行結果から構造体のサイズは、8バイトと思います。

投稿2018/10/30 10:49

ai_2013_dev

総合スコア338

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問