開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C (プログラミング言語)
- Clang (コンパイラ)
C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅡ部(単純なプログラミング)の13章(単純なポインタ)、13.1(ポインタ)、13.2(関数引数としてのポインタ)、13.3(constポインタ)、13.4(ポインタと配列)、13.5(ポインタを使用しない方法)、13.6(ポインタを使用した文字列分割)、13.6(ポインタを使用した文字列分割)、13.7(ポインタと構造体)、13.8(コマンド業引数)、設問 13-2を解いてみる。
その他参考書籍
- プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)
- プログラミング言語Cアンサー・ブック 第2版 (クロビス・L.トンド、スコット・E.ギンペル(著)、矢吹 道郎(翻訳))
設問 13-2.
name1、name2にnameへのポインタが代入される。そのとき、2回目のtemp_nameの呼び出しで、nameの値はtemp2になっている。name1もnameの値、temp2を指していることになるので、出力結果は、
Name: tmp2 Name: tmp2となる。
確認。
入出力結果(Terminal)
$ make cc -g -o sample sample.c $ ./sample Name1: tmp2 Name2: tmp2 $
意図した出力結果を得るには、name1,、name2をポインタではなく配列にして、nameの値を書き換える前に、値を代入しておいてから出力すればいい。
修正。
コード
sample.c
#include <stdio.h> #include <string.h> char *tmp_name(void) { static char name[30]; static int sequence = 0; ++sequence; strcpy(name, "tmp"); name[3] = sequence + '0'; name[4] = '\0'; return (name); } int main() { char *tmp_name(void); char *name1; char *name2; name1 = tmp_name(); printf("Name1: %s\n", name1); name2 = tmp_name(); printf("Name2: %s\n", name2); return (0); }
makefile
CC=cc CFLAGS=-g sample: sample.c $(CC) $(CFLAGS) -o sample sample.c clean: rm -f sample
入出力結果(Terminal)
$ make cc -g -o sample sample.c $ ./sample Name1: tmp1 Name2: tmp2 $
0 コメント:
コメントを投稿