C++で、ポインタを別の型のポインタに代入する際に明示的にキャストをしなければコンパイルエラーが出るのは、
それでポインタ値が変わることを防げるからではなく、
「代入に伴って、ポインタ値が変わる可能性がある」ということを処理系やプログラムを読む人に伝えるべきだからということですね!
Mathさん、伊藤詩織さん、usaoさん
ありがとうございました!
検索結果 16 件
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: C++のvoidポインタの明示的なキャストについて
- 返信数: 22
- 閲覧数: 17400
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: C++のvoidポインタの明示的なキャストについて
- 返信数: 22
- 閲覧数: 17400
Re: C++のvoidポインタの明示的なキャストについて
Mathさん
すいません!コードをcに指定する事を忘れていました
僕の環境でもpcとpdは同じになったのですが、
コラムに実行結果一例としてpc=9 pd=16とあったので、変わってしまうことがあると理解しました
僕の環境と、想定している環境が違っているからpcとpdが同じになったのだと思います
すいません!コードをcに指定する事を忘れていました
僕の環境でもpcとpdは同じになったのですが、
コラムに実行結果一例としてpc=9 pd=16とあったので、変わってしまうことがあると理解しました
僕の環境と、想定している環境が違っているからpcとpdが同じになったのだと思います
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: C++のvoidポインタの明示的なキャストについて
- 返信数: 22
- 閲覧数: 17400
Re: C++のvoidポインタの明示的なキャストについて
Mathさん
確認しましたが間違えていませんでした
cコンパイラでコンパイルすると警告は出ますがコンパイルは通りましたが、
c++コンパイラでコンパイルすると画像と同じようなエラーが出ました
void*型との関連は、
確認しましたが間違えていませんでした
cコンパイラでコンパイルすると警告は出ますがコンパイルは通りましたが、
c++コンパイラでコンパイルすると画像と同じようなエラーが出ました
void*型との関連は、
と説明されていますこのプログラムでは、char*型を例にとって説明しましたが、void*型は1バイトの境界調整をもち、任意のアドレスを指すことができるという点ではchar*型と共通です
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: C++のvoidポインタの明示的なキャストについて
- 返信数: 22
- 閲覧数: 17400
Re: C++のvoidポインタの明示的なキャストについて
usaoさん、伊藤詩織さん その本の最後に、 C言語では明示的なキャストが必須ではないとは言え、ポインタの値を、異なるポインタ型に代入する際は「代入に伴って、ポインタ値が変わる可能性がある」ということを、処理系やプログラムを読む人に伝えるべきです。そういう意味では、キャストが必須ではないC言語でも明示的なキャストを行うほうが好ましいといえます と書いてあったので、C++には他の理由があると思ったのですが、これを"書かなければいけない"と決めたというだけの話なのでしょうか・・・ Mathさん 書名は 新・明解C言語中級編 です。 このコラムにはポインタを他の型へのポインタに変換すると値が変わる可...
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: C++のvoidポインタの明示的なキャストについて
- 返信数: 22
- 閲覧数: 17400
Re: C++のvoidポインタの明示的なキャストについて
Mathさん
メモリを確保してvoid*型にアドレスを入れてから、キャストして確保したメモリの位置を変更するのではなくて
初めからキャストされた型としてメモリを確保するということですか?
コンパイル時点でキャストが分かるから上のようなことをするのは手間がかかるだけなのかな・・・
そうだとしても、暗黙的なキャストでも明示的なキャストでも行われるのではないですか?
メモリを確保してvoid*型にアドレスを入れてから、キャストして確保したメモリの位置を変更するのではなくて
初めからキャストされた型としてメモリを確保するということですか?
コンパイル時点でキャストが分かるから上のようなことをするのは手間がかかるだけなのかな・・・
そうだとしても、暗黙的なキャストでも明示的なキャストでも行われるのではないですか?
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: C++のvoidポインタの明示的なキャストについて
- 返信数: 22
- 閲覧数: 17400
Re: C++のvoidポインタの明示的なキャストについて
Mathさん
キャストをすれば正しいアライメントになる とは、メモリの配置を変えるということですか?
キャストをすれば正しいアライメントになる とは、メモリの配置を変えるということですか?
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: C++のvoidポインタの明示的なキャストについて
- 返信数: 22
- 閲覧数: 17400
C++のvoidポインタの明示的なキャストについて
現在C言語を勉強していて、使用している本のコラムに、 C++では、voidへのポインタを、別の型へのポインタに代入する際には、キャストが必須です。 とあり、その理由を境界調整で説明しています。 そのコラムの最後の方に ポインタを他の型へのポインタに型変換するということは、その値までもが変わる可能性のある危険な行為です。 そのため、C++では、voidへのポインタを別の型へのポインタに代入する局面では、明示的なキャストが必須となっているのです。 と書いてあります。 境界調整というものでポインタの値が勝手に変わってしまうことがあることは理解したのですが、それが明示的なキャストをすることでどのように...
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: makeのエラー
- 返信数: 1
- 閲覧数: 1726
Re: makeのエラー
setupで、カタログにあるX11をすべてインストールするとエラーが出なくなりました。
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: makeのエラー
- 返信数: 1
- 閲覧数: 1726
makeのエラー
CygwinにAllegroを入れようと色々と試しているところです。 現在zipファイルをダウンロード、解凍して、READMEファイルを参考にcmakeを実行し終えました。次にmakeを実行してAllegroを構築したいのですが、以下のエラーが出てしまいます In file included from /usr/lib/allegro/src/opengl/extensions.c:42:0: /usr/include/w32api/GL/glu.h:68:79: エラー: expected ‘)’ before ‘*’ token void APIENTRY gluQuadricCallba...
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: CygwinにAllegroを導入?
- 返信数: 3
- 閲覧数: 2796
Re: CygwinにAllegroを導入?
回答ありがとうございます。
Cygwinのgccでは出来ないのでしょうか?
Cygwinのgccでは出来ないのでしょうか?
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: CygwinにAllegroを導入?
- 返信数: 3
- 閲覧数: 2796
CygwinにAllegroを導入?
CygwinでAllegroを使い簡単なゲームを作りたいのですが、どのようにするとAllegroを使用できるのかが分からず困っています。
公式サイトへ飛んでzipファイルをダウンロードしてもどこに何を置けばいいのか、他に何が必要なのかも分かりません。
CygwinでAllegroを使うためにはどのような手順を踏む必要があるのかが知りたいです。
公式サイトへ飛んでzipファイルをダウンロードしてもどこに何を置けばいいのか、他に何が必要なのかも分かりません。
CygwinでAllegroを使うためにはどのような手順を踏む必要があるのかが知りたいです。
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: execでwebページが開けない
- 返信数: 5
- 閲覧数: 3532
Re: execでwebページが開けない
cmd /c start ではなく、cygstart を使用したらブラウザでwebページを開くことができました。
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: execでwebページが開けない
- 返信数: 5
- 閲覧数: 3532
Re: execでwebページが開けない
Unixを前提として書かれていますが、windowsの場合はCygwinを入れると良いとも書いてありました
それを使ってエラーは出ていないはずですが・・・
それを使ってエラーは出ていないはずですが・・・
- 8年前
- フォーラム: C言語何でも質問掲示板
- トピック: execでwebページが開けない
- 返信数: 5
- 閲覧数: 3532
execでwebページが開けない
現在ある書籍でC言語を勉強しています。 環境は、windows10にcygwinで、どちらも64bitです。 その本にexecを使って、webページを開くプログラムの一部が書いてあるのですが上手くいきません。 具体的にはそのプログラムを実行すると、表示したいwebページのURLをタイトルとしたコマンドプロンプトが起動してしまいます。 どうしてこのような事が起こるのか、どうしたらwebページを表示できるようになるのかを知りたいです。 そのコードは次の通りです。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include ...
- 9年前
- フォーラム: C言語何でも質問掲示板
- トピック: C言語の後置インクリメントについて
- 返信数: 2
- 閲覧数: 2291
Re: C言語の後置インクリメントについて
解答ありがとうございました。
2007年時点ではtoupper(*p)の計算が、pが増える前に行われるか、増えない前に行われるか決定できないので未定義動作となるということで本が間違っているということが分かりました。
現在では = の右辺と左辺の評価の順番が決定していないので未定義動作となるということもわかり、解決しました。
2007年時点ではtoupper(*p)の計算が、pが増える前に行われるか、増えない前に行われるか決定できないので未定義動作となるということで本が間違っているということが分かりました。
現在では = の右辺と左辺の評価の順番が決定していないので未定義動作となるということもわかり、解決しました。
- 9年前
- フォーラム: C言語何でも質問掲示板
- トピック: C言語の後置インクリメントについて
- 返信数: 2
- 閲覧数: 2291
C言語の後置インクリメントについて
現在、2007年に出版された本を使ってC言語を学習しているのですが、本に載っているコードが本に書いてあるとおりの結果にならなかったので、原因を教えて下さい。書いてあるコードは #include <ctype.h> #include <stdio.h> int main(void) { char str[80], *p; printf("文字列を入力してください: "); gets(str); p = str; while(*p) *p++ = toupper(*p); printf("%s\n", str); return 0; } というものです。 本に書いてあるとおりに動かないのは、 wh...