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

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

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

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

Q&A

解決済

2回答

5524閲覧

C言語  bzeroについて(引数の意味が分からない(char *)&client_addr sizeof(client_addr))

kazuyakazuya

総合スコア193

C

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

0グッド

0クリップ

投稿2019/08/25 02:55

C言語をリンク内容
こちらの記事で学習しています。
初心者で知識が枯渇しているので教えてください。
イメージ説明

C

1/* ソケットを生成 */ 2 3 if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) > 0) { 4 5 perror("client: socket"); 6 7 exit(1); 8 9 } 10 11 12 13 /* 14 15 * client_addr構造体に、接続するサーバのアドレス・ポート番号を設定 16 17 */ 18 19 bzero((char *)&client_addr, sizeof(client_addr)); ←ここ! 20 21 client_addr.sin_family = PF_INET; 22 23 client_addr.sin_addr.s_addr = inet_addr(argv[1]); 24 25 client_addr.sin_port = htons(8000); 26 27 28

この中の

C

1bzero((char *)&client_addr, sizeof(client_addr));

この部分がわかりません。
調べていくと・・・
参考記事
イメージ説明
つまり、このコードは

C

1bzero((char *)&client_addr, sizeof(client_addr));

C

1(char *)&client_addr に対して sizeof(client_addr)の文だけ0で埋めよ

と書いてあるのだと思います。(たぶん・・・)

それで私が理解できないのはこの

C

1(char *)&client_addr 23sizeof(client_addr)

の意味が理解できないです。

#質問1 sizeof(client_addr)

まず、

C

1sizeof(client_addr)

この文は要するにclient_addrの分だけ埋めよ・・・という意味だと思うのですが
client_addrに量・大きさという概念はないはずですよね?
上のほうに

C

1 struct sockaddr_in client_addr; 2      ↑      ↑ 3   この意味が     変数 4  まだわからない 5  ・・・。   

構造体の初期化を宣言する文がありますが・・・
やっぱ量とかはないはずですよね?

なので
client_addrの分だけ埋めよ
この埋めよの意味が理解できないのです。
(うまく説明できない・・・)

#質問2 

C

1(char *)&client_addr に対して sizeof(client_addr)の文だけ0で埋めよ

の中の

C

1bzero((char *)&client_addr

この文の意味がわかりません。
構造体の中の何かを埋めることはわかるのですが
結局何がしたいのかが分かりません・・・。

基本的なことからわからないです。
分からないので参考になるリンクまたは説明をお願いします。

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

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

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

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

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

guest

回答2

0

変数ってなんだろう。

C言語を勉強するなら、言語自体の話だけじゃなくて、コンピュータの中身を知って下さい。(他の言語でも知っておいたほうがいいけど、特にC言語をそれを知らないと話にならない時もあるから。今回のように)
コンピュータの中には、CPUがあります。メモリがあります。ストレージがあります。その他色々入ってます。
今のコンピュータでは、「プログラムもデータもひっくるめて、メモリに全部入っている」というのが重要なキーポイントです。プログラムの話は今回は置いておくとして、変数というのは、メモリの(ごく)一部を、「変数という、データ置き場に使いましょう」と決めたものです。
メモリは、通常8bit(bitはわかります?)をひとまとめにして、一つのアドレスを与えてあります。いわば、ロッカールームに番号付きのロッカーがずら~っと並んでいるイメージ。
変数は、このロッカー(メモリ)をデータ倉庫に使う、その時の名札(シンボル)とでも思って下さい。8bitで収まるデータなら、このロッカーを一つ使って変数にしますけれど、もっと大きなデータは、このロッカーを連番で占領します。そして、一番最初のロッカー番号(アドレス)を変数のアドレス、ということにします。

bzeroは、変数とかそういうのにはとりあえず関係なく、指定されたアドレスから指定した数のメモリの中身を0という値にしちゃうという働きを持っています。
では、client_addrという変数の領域を全部0にしたかったらどうしましょう。
client_addrの変数が入っているアドレスから
client_addrの変数が占めているメモリサイズだけ
0にしますよね。

client_addrに量・大きさという概念はない

確かに、client_addrというシンボルそのものが量・大きさを表してはいませんが、client_addrはこの場合、変数に関する情報へのインデックスのようなものです。
client_addrの変数が入っているアドレス(の先頭)は、アドレス演算子&で、&client_addrとして求められます。
なお、bzeroに与える第一引数の型はvoid型(汎用の、つまり型は何でもいいからアドレス値を頂戴、という型)なので、ここは実はキャスト(charに読み替え)する必要は実はありませんが...
client_addrの変数が占めているメモリサイズは、sizeof演算子で size of client_addrとして求められます。

あと、どうでもいいけど、「枯渇」というのはこれまであったものがすっからかんに無くなる、という意味の言葉ですよ。

投稿2019/08/25 04:55

thkana

総合スコア7629

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

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

kazuyakazuya

2019/08/25 05:52

ありがとうございます!
kazuyakazuya

2019/08/25 06:23

client_addrという変数の領域を全部0にしたかったら >アドレスの領域を0にするというのは (1バイトを1メモリとして管理する なら4バイト?) 本来4バイトの領域を確保していたメモリ(指定したアドレスの) を0にするということですよね? つまりそれはメモリ(変数)にデータがもう入らなくなるということですか?
kazuyakazuya

2019/08/25 06:35

すみませんやっぱ理解できました。 大丈夫です。 数というのがバイトのことなのか数字のことを指しているのかで悩んでいました。
thkana

2019/08/25 07:21

私の文中では「数」という言葉は > 指定されたアドレスから指定した数のメモリの中身を0という値にしちゃう というところでしか使っていなくて、「指定した数のメモリ」つまりロッカーに例えたメモリの個数を意図して(その意味では、「バイト」かな。特に単位を縛るつもりはなくて)、その値は「中身」という言葉にして明示的に分けたつもりだったのですが、わかりにくかったですか? なら表現を考えないといけないかなぁ... あと、「数字」という言葉はプログラムコードの話をするときは注意深く使うべきかと思います。少なくとも、私はCで言えば'1'とか'5'、あるいは"100"とかいうものつまり文字/文字列である場合「数字」と呼びますが、1とか5、0や100(' 'や" "で囲まれてない)なら「値」「数値」として、決して「数字」とは呼ばないようにしています。
kazuyakazuya

2019/08/25 10:25 編集

「数字」という言葉はプログラムコードの話をするときは注意深く使うべきかと思います。 >あまり意識していませんでした・・・ やっぱ不安なのでお願いします。 つまりbzeroは 指定したアドレスが確保しているメモリを 4バイトだったら 4バイト分  0000000000000000 で埋め尽くすということでしょうか?
thkana

2019/08/25 10:32

そういうことです。 普通1バイトは16進数2桁で表記するので、4バイトなら 00 00 00 00 ^先頭アドレス ということで。
kazuyakazuya

2019/08/25 10:33

ありがとうございます!
guest

0

ベストアンサー

(char *)&client_addr

client_addrのアドレスを、char* でキャストしてます

sizeof(client_addr)

client_addr のサイズ(バイト数)です

はやいはなしが、client_addr の先頭アドレスから、 client_addr のサイズ分を0で埋めるって意味ですね

なぜchar* でキャストしてるかって?それはその関数がchar* を引数に取るようになってるからです。

投稿2019/08/25 02:57

編集2019/08/25 02:59
y_waiwai

総合スコア87749

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

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

kazuyakazuya

2019/08/25 03:17

ありがとうございます。 client_addrは変数だとおもうのですが client_addr変数には何も入っていないですよね? だからサイズも何もないと思うのですが・・・。
archiver

2019/08/25 03:22

C言語の基礎からやり直したほうがいいんじゃない。 「変数」とか「型」とか辺り。
y_waiwai

2019/08/25 03:22

client_addr は変数です。 変数というからには、数値を入れるためのサイズを持ちます たとえば、int変数は4バイトのサイズを持ちます。なにかを入れようが入れまいがそれは変わりません
kazuyakazuya

2019/08/25 03:27

ありがとうございます!
SaitoAtsushi

2019/08/25 05:22

過去の質問を読むと Ruby を主にやっている方のようですね。 Ruby を含めていわゆる動的型の言語ではどこかにあるオブジェクトを変数に束縛 (bind) するモデルであり変数は型を持たずオブジェクトが型 (必然的に大きさも) を持つのでその考え方にとらわれているのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問