開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C (プログラミング言語)
- Clang (コンパイラ)
C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅢ部(高度なプログラミング概念)の17章(高度なポインタ)、17.3(リンクリスト)、設問 17-1を解いてみる。
その他参考書籍
- プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)
- プログラミング言語Cアンサー・ブック 第2版 (クロビス・L.トンド、スコット・E.ギンペル(著)、矢吹 道郎(翻訳))
設問 17-1.
whileループの評価で、current_ptrが解放されたポインタかどうかを確認せずに、current_ptr->dataとしているので、bus error、または1を返すことがある。そうならないように、current_ptrが解放されたポインタかどうかをcurrent_ptr->dataより先に確認するようにすればいい。
修正。
コード
sample.c
#include <stdio.h> #include <stdlib.h> #include <string.h> struct linked_list { struct linked_list *next_ptr; char *data; }; struct linked_list *first_ptr = NULL; int main(int argc, char *argv[]) { char *langs[] = {"python", "haskell", "dart", "scheme"}; struct linked_list *second_ptr; int find(char *name); first_ptr = malloc(sizeof(struct linked_list)); second_ptr = malloc(sizeof(struct linked_list)); first_ptr->next_ptr = malloc(sizeof(struct linked_list)); first_ptr->next_ptr = second_ptr; first_ptr->data = "python"; second_ptr->next_ptr = malloc(sizeof(struct linked_list)); second_ptr->next_ptr = NULL; second_ptr->data = "haskell"; for(int i = 0; i < 4; i++){ printf("%s: ", langs[i]); if(find(langs[i])){ printf("発見!\n"); } else { printf("見つからなかった\n"); } } return (0); } int find(char *name) { struct linked_list *current_ptr; current_ptr = first_ptr; while((current_ptr != NULL) && (strcmp(current_ptr->data, name) != 0)){ current_ptr = current_ptr->next_ptr; } return (current_ptr != NULL); }
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 python: 発見! haskell: 発見! dart: 見つからなかった scheme: 見つからなかった $
0 コメント:
コメントを投稿