開発環境
- 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 コメント:
コメントを投稿