2013年12月15日日曜日

開発環境

C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅢ部(高度なプログラミング概念)の17章(高度なポインタ)、17.3(リンクリスト)、設問 17-1を解いてみる。

その他参考書籍

設問 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 コメント:

コメントを投稿