本文へスキップ

技術士試験(情報工学部門)・情報技術者試験。ファーストマクロ。


Since 2016.4.19

平成23年度 技術士第一次試験問題【専門科目】

W−1

次のC言語のプログラムは不適切である。その理由として最も適切なものはどれか。ただし、プログラム中の左端の数字は行番号であり、プログラムには含まれない。19行目には注釈に示すようなプログラム部分 (そこには不適切な内容は含まれないとする) があるが、その詳細はここでは省略した。

  1 #include <stdio.h>
  2
  3 struct intpair {
  4  int m, n;
  5 };
  6
  7 struct intpair *f(int m, int n) {
  8  struct intpair t;
  9  t.m = m;
 10  t.n = n;
 11  return &t;
 12 }
 13
 14 int main (void) {
 15  struct intpair *p, *q;
 16  p = f(1, 2);
 17  q = f(3, 4);
 18  printf("%d, %d, %d, %d\n", p->m, p->n, q->m, q->n);
 19  /* ここに p と q を用いた計算を行うプログラム部分がある。*/
 20  return ();
 21 }

@ 構造体 intpair の定義の最後 (5行目) に、余計な ; がついている。

A 関数 f の仮引数名と構造体intpairのメンバ名が、重複 (ともにm と n) している。

B 9行目及び10行目の代入の左辺が、それぞれ t->m、t->n になっていない。

C 関数 f が局所変数へのポインタを返している。

D 18行目の printf の書式が誤っている。


正解

C


解説

@ 構造体の定義にも ; が必要である。

A 仮引数名と構造体のメンバ名が同一でも構わない。

B -> を使用するのは -> の左側の変数がポインタの場合であり、intpair t; として定義されているため適切である。

C 正しい。局所変数 (ローカル変数) t のアドレスを関数の値として返すのはおかしく、C言語のプログラムは不適切である。

D 構造体メンバの m, n は整数型であり、正しい構文である。

目次 W−2