• ベストアンサー

情報処理技術者試験は本当にC89?

sakusaker7の回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> wikipedia での脚注1に stdlib.h 忘れに対してキャストがあると困ったことになると書かれています。 脚注1って↓ですよね |stdlib.hをインクルードし忘れた場合、コンパイラはmallocがint型であるとみ |なす。これをキャストしているとインクルードし忘れたことに気づかないが、 |キャストしていないとコンパイル時にintをポインタ型変数に代入しようとしてい |るとして何らかのメッセージが表示される。 「困ったことになる」とは具体的にどれを指して言ってますか? またC言語FAQの方ですが |7.7: |mallocが返した値を確保したデータ型のポインターに注意深くキャスト |しているコードをたまに見るのはなぜか。 |A: |ANSI/ISO規格のC言語がvoid *という汎用のポインター型を導入するまでは、 |互換性のないポインター型の間で代入をするときに警告を黙らせるのに |こうしたキャストが必要となることがよくあった。 |(ANSI/ISO規格のCでは、こうしたキャストはもう必要ない。) のことを指しているのだと思いますが、 「必要ない」ことをやって害があるのなら それは止めるべきだとは思いますが、 大元とのサンプルとやらに関しては放置していいレベルのものだと思います。 ただ英文の方の FAQ 7.7 を見ると | But of course malloc does not return an int, | so trying to convert the int that it doesn't return | to a pointer is likely to lead to a | different kind of trouble, which will be harder to track down. という文はあります。 とはいうものの、実際にコンパイラに食わせてみると int main() { char *p; char *q; q = (char *)malloc(1024); p = malloc(1024); return 0; } >cl -nologo -W2 -c mmm.c mmm.c mmm.c(8) : warning C4047: '=' : 間接参照のレベルが 'char *' と 'int' で異なって います。 >cl -nologo -W3 mmm.c mmm.c mmm.c(7) : warning C4013: 関数 'malloc' は定義されていません。int 型の値を返す外 部関数と見なします。 mmm.c(8) : warning C4047: '=' : 間接参照のレベルが 'char *' と 'int' で異なって います。 >gcc -Wall -c mmm.c mmm.c: In function 'main': mmm.c:7: warning: implicit declaration of function 'malloc' mmm.c:7: warning: incompatible implicit declaration of built-in function 'malloc ' >gcc -c mmm.c mmm.c: In function 'main': mmm.c:7: warning: incompatible implicit declaration of built-in function 'malloc ' 警告しないわけでもないのでスルーしてもいい問題だと思います。 > 私も含む初心者が混乱しないでしょうか? 確かにあなたは混乱したわけですから、しないとは言い切れないでしょう。 しかしながら初心者がおしなべて誤解するのか、 全員でなくても少なからぬ人が誤解するのかどうかは わたしにはわかりませんしあなたもわからないですよね(想像で言うのをなしにして)。 結論として記述を修正すべき問題であるとは わたしには思えません。

voronoi
質問者

お礼

回答ありがとうございます。#4での「レベル」云々の所は私に何かを暗示しているのかな、とは思っていましたが勉強になりました。 こう聞けばよかったと反省しています。 C89 において、 int *p; p=(int *)NULL; は、奇異に感じませんか? void* -> int* の自動型変換という意味においては、これも p=(int *)malloc(sizeof(int)); も私には同様に思えます。 それとも、C++に無理に合わせてmallocをキャストする場合でも、 p=NULL; とするんでしょうか。

voronoi
質問者

補足

jactaさんの方でも補足しましたが「私も含む初心者が混乱しないでしょうか?」は情報処理技術者試験の出題側に対してです。 どちらでもよいとのご指摘ですが、 int a=10; int b; b=(int)a; が問題文にあった場合(特に初心者は)奇異に感じませんか? 解答ならこれでも正解でしょうが、これだけ多くの方が受験している(この試験を期にCの勉強をはじめる人もいる)試験の問題では模範的な問題文が求められると思います。私の勉強不足なのでしょうが、なによりmallocでキャスト演算子を用いた際に何がメリットなのかが今もって私には理解できていません。

関連するQ&A

  • 情報処理技術者試験について。

    情報処理技術者試験について。 こんにちは!今工学部4年です。 技術者としてある企業から内定を頂いたので、基本知識くらい持っておいた方がいいかと思い、 情報処理技術者試験を受けようかと思います。 しかし、いろいろな試験があり、どれを受ければいいのか分かりません。 大学の勉強はあまり真面目に受けていなかったことと、 プログラミングはマイナーな言語しか扱ったことがないため、(Cは触ったことがある程度です。) ITパスポートか基本情報技術者を受けようと思うのですが、 それぞれ何がどう違うのでしょうか? また、新卒の技術者として最低限知っておくべき(持っておくべき)レベルの資格はどれに当たりますか? 回答よろしくお願いします。

  • 情報処理技術者試験

    情報処理技術者試験の基本を受験するのですが 午後の問題の13問あって5問は必衰で あとの8問中2問を選択するって事は プログラム言語が違うからですか??? 勉強しているのはC言語だけですが 大丈夫でしょうか???

  • 基本情報処理技術者試験

    初めて、基本情報処理技術者試験を受けようと思っています。私の知識としては「情報処理活用検定3級」「C言語プログラミング能力認定試験3級」を持ってるくらいです。今から勉強を始めようと思っております。会社も辞めたばかりで一日中時間が空いております。この状態で4月までに受かるでしょうか。それとどういった勉強方法が良いのでしょうか?ご教授宜しくお願いします。

  • 情報処理技術者試験についてアドバイスお願いします

     自己啓発のため、パソコン全般の知識を増やすために勉強しています。どうせ勉強するなら目標があった方がよいと考え、次回の情報処理技術者試験を受験しようと考えています。ちなみに初級シスアドは取得済みです。今現在考えているのは「基本情報処理技術者試験」か、「情報セキュリティアドミニストレータ」です。始めは後者の方が初級シスアドのステップアップとしては良いかな、と考えていましたが、まだ参考書などがあまりないことなどから、対策が立てにくい印象を持ち、前者にしようかという気持ちに傾いてきています。しかし、プログラミング(午後対策)の知識はほとんどなく、受験するなら今から言語を選ぶような状態です。社会人ではないので、比較的時間は作り易いと思うので、やると決めたら頑張れると思っています。質問らしくない文章になってしまいましたが、受験選択などのアドバイスよろしくお願いします。また、「基本情報処理技術者試験」を受けるとしたら言語はC言語か、Javaを考えているのですが、その点についてもアドバイスよろしくお願い致します。

  • C言語(C89)での文字列代入

    C言語文法のうち、gcc 拡張機能を含まない C89 規格で、 文字列の「= での代入」は可能なんでしょうか? strcpy が必要だと思っていました。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ char *p; p=malloc(30); p="Hello"; printf("%s\n",p) return 0; } gcc で gcc -Wall -std=c89 -pedantic-errors としてコンパイルしても なんのエラー表示もなく正常に動作しています。 これまでC89では「=での文字列代入」は(宣言時を除いて)できない と思ってたので不思議です。 ちなみに、free(p) を return 0; の前に入れると、エラーになります。 情報処理技術者試験(試験で要求される規格はC89)を受ける知り合い から質問されたのがきっかけです。

  • 情報処理技術者試験

    情報処理技術者試験の基本情報技術者試験を 受験しようと思っているのですが 基本情報技術者試験は筆記だけで 実技(PC操作)とかはないんですか???

  • 情報処理技術者試験

    情報処理技術者試験を受けようと思っているのですが ITパスポート試験 基本情報技術者試験 応用情報技術者試験 ITストラデジスト システムアーキテクト ・・・・など、11項目ありますよね? 初めてなのですがどれを受けたらいいのでしょうか・・・?

  • 基本情報処理技術者試験

    自分は今大学3回生なのですが、題の通り、情報処理技術者試験を受けようと考えてます。それで、卒業するまでには取りたいと思ってるんですが、その勉強法を伝授していただきたいです。 持ってる知識はC言語を少々できるくらいで、それ以外は(試験内容に関して)ほとんど知らないです。こういう場合、どのように始めるべきでしょうか? やはり、通信講座などを利用すべきでしょうか。 今のところ参考書あたりを眺めてるんですが、決めかねてます。 よろしくお願いします。

  • 情報処理技術者試験

    情報処理技術者試験の基本情報技術者試験を 受験しようと思うのですが 難易度はどの位なのでしょう???? 1~10でどのくらいでしょう??? 現在、16歳です

  • 情報処理技術者試験 新試験制度について

    情報処理技術者試験について教えてください。 新試験制度によって変更に伴って、 今後の情報処理関係の資格取得に当たって考えていることがあります。 私は基本情報処理試験の取得を考えているのですけれども、新しくなった試験の分別がまだついておらず悩んでいるのですが・・・ IT パスポート試験 (レベル1) = シスアド級 基本情報技術者試験 (レベル2)= 基本情報処理 + シスアド? 応用情報技術者試験 (レベル3)= ソフトウェア開発? という分別で合っていますでしょうか? 仮に基本情報技術者試験 (レベル2)取得する前提で勉強するならば、基本情報処理 + シスアドの勉強を進めていき、知識を固めていくのが無難でしょうか?