連結リストのデータにポインタを使うのはいけないのか

さっきまでCで連結リストを実装していた。

その際、

typedef struct {

Data *data;
Node *next;

} LinkedList;

というように実装していた。

そしてうまく動作せずgdbデバッグしたりしてたんだけど、いくらやってもうまくいかない。 しかも、ググっても連結リストのデータ型をポインタにしてるものは全く見当たらない。

一体何がいけないんだろう。

C言語のポインタがやっぱりよくわかってなかったんだけどこの記事を書いてるうちにその部分はわかりました! わーい!

C言語の簡単なプログラムを作って構造体とポインタの挙動を調べているんだけど、やっぱりよくわからないところが出てきた。

まず、こう書いてみる。

#include <stdio.h>
#include "test.h"
#include <string.h>
#include <stdlib.h>

int zero = 0;

typedef struct{

    int *x;
} X;

typedef struct piyoo{

    X *piyo;
    struct piyoo *next_piyo;
} PIYO;


PIYO *make_piyo() {

    PIYO pi, *piyopiyo;
    piyopiyo = &pi;
    piyopiyo = malloc(sizeof(PIYO));
    piyopiyo->piyo = malloc(sizeof(X));
    
    piyopiyo->piyo->x = &zero; 
    piyopiyo->next_piyo = NULL;
        
    return piyopiyo;

}

void delete_piyo(PIYO *piyopiyo) {
    
    free(piyopiyo->piyo);
    free(piyopiyo);
}

int main() {

    
    PIYO *piyopiyo = make_piyo();   
    
    printf("piyo %d\n", *(piyopiyo->piyo->x));
    
//  delete_piyo(piyopiyo);

    free(piyopiyo->piyo);

    int y = 3;

    piyopiyo->piyo->x = &y;

    printf("3 %d\n", *(piyopiyo->piyo->x));

    free(piyopiyo);

    return 0;


}

何をしているのかというと、自己参照構造体PIYOを作り、PIYOはメンバとして構造体Xを持っている。このXの中身はint型のポインタだ。

で、いま関数make_piyoPIYOを初期化しょうとしている。このとき、PIYOの唯一の実体であるpiyopiyo->piyo->xの中身を0にしようとしている。

上のコードでは、piyopiyo->piyo->xグローバル変数zeroのアドレスを格納する、というやり方をとっている。

ところが、次のようにコードの該当部を変更するとセグフォする。

*(piyopiyo->piyo->x) = x;

関数make_piyoでは、PIYO構造体としての実体のpiを作り、そのアドレスをpiyopiyoに格納している。で、実体のpi.piyoが指し示しているポインタxの指し示す実体の内容を変えたかった。

本当はわからないので記事を投稿して反応を待とうと思ったんだけど、書いているうちに原因がわかってしまった。 PIYO構造体piが保持しているのはあくまでint型へのポインタ(つまり、アドレスを格納する場所)のみであって、そこに実体のintはない。だから実体に代入しろと言われても無理ですと言われるのは当然だ。

アウトプットしたり他人に説明したりすると理解できるようになる、ということが実験で証明されていた気がする。 アウトプットってすごい。

C言語の構造体のメンバにポインタ変数を使った時の挙動がよくわからない

#include <stdio.h>
#include <stdlib.h>
#include "point.h"

int main() {

Point hoge;
hoge = point_init(0,0);

printf("%d %d\n", *(hoge.x), *(hoge.y));

return 0;

}
#include <stdio.h>
#include "point.h"

 

Point point_init(int s, int t) {

Point p;
p.x = &s;
p.y = &t;
int i = 1;
p.flag = &i;

return p;
}

これはうまくいく。

しかし、

#include <stdio.h>
#include "point.h"

 

Point point_init(int s, int t) {

Point hoge, *p;
p = &hoge;
((*p).x) = &s;
//p.y = &t;
//int i = 1;
//p.flag = &i;

return *p;
}

こうするとコンパイルは通るが、セグフォする。

さっきから考えてるんだけど理由が全然わからない。

理由がわかったら追記したい。(もし分かる人がいたら誰か教えてください)

「アイドル稼業、はじめました!」(岩関昂道先生)感想

「アイドル稼業、はじめました!」を読み終わった。


簡単にあらすじを書くと、主人公・成田利生は公園で出会った女の子に惚れてしまい、彼女が人気女優・瀬戸あおいであったことを知って自らも俳優となってもう一度彼女に会いたいと芸能界入りを志すが、なんやかんやあって男と女を行き来できる身体になり、俳優・成田利生とアイドル・鳴海リセの二足のわらじを履くことになる。途中からリセはあおいの不倫疑惑を打ち消すためにアイドルグループのメンバーと共に奔走するようになるのだが……。

というお話。


とても面白かった。


冒頭の、利生があおいと公園で出会ってから俳優を志すまでで利生のまっすぐさがとても魅力的に描かれていた。そこまでは王道という感じだったのが、受けに行ったオーディションからストーリーが急転回。「演技力もルックスもない利生がどうやって芸能界へ入るんだろう?」と思いながら読み進めると物語がそれまでとは全く異なる様相を呈しはじめたのが面白かった。


主人公の利生は男であり、彼のあおいへの恋がこの物語のきっかけとなっているわけだが、物語中では基本的にアイドルグループ「ガールズ・ジョーカー」(通称ガルジョ)の鳴海リセとして過ごしながら話が進んでいく。リセは憧れのあおいにかけられた不倫疑惑を撤回させるために動いていくのだが、まずこの「謎を追求する」筋が面白かった。スクープの相手であるイケメン俳優の白鳥は、事実無根であるにも関わらずあおいとの不倫を認めて謝罪する。そんなことをするメリットはないはずなのに、なぜ虚偽の不倫を認めたのか?  リセもそして読者の私も最初はちんぷんかんぷんで、ここでかなり物語に。それからリセがガルジョのメンバー、みつき・兎と記者・谷口らの協力を得て危機にあいながらも謎を追究していく過程で主人公たちを心から応援したし、最後に全ての真相を解き明かすシーンはとても爽快だった。


この作品で私が一番胸に来たのは、主人公と兎・みつきの逆境を切り開くパワーだ。彼女は芸能界の掟や大人の汚さがよくわかっておらず「不倫疑惑を撤回しろ」と正面から相手やその事務所の社長、記者から出版社にまで食ってかかり、読んでいるこちらはとてもハラハラさせられた。自分だったらアイドルであることや正面から問いただしても相手は確実に認めないだろうと考え、もっと裏から手を回すのが賢いやり方だと思っているが、けれど彼女たちのそうした愚直さが私にはなぜか魅力的だった。もしかしたら私ならそうして正面から向き合うことを避け、その結果結局何もできないと諦めてしまうかもしれない。彼女たちのやり方は賢明ではないのだろうが、マスコミに否定的に報じられ、相手や事務所社長の怒りを買ってもものともせず自ら道を切り開いていくパワー、その力強さとたのもしさをそこに見たのだ。そんな主人公やみつき・兎の姿に胸を打たれた。


……と思ってたらあとがきで作者の岩関先生がまさにこのことを書いていて、なんだか嬉しくなってしまった。やったー。


それに加えてキャラクターもとても良かった。みつきはストレスがたまるとすぐ過呼吸になり「ヒーッ! ヒーッ!」と呻き出すアイドルに似つかない一面を持った女の子だけど、気が強くてガルジョのリーダーとしてリセと兎を引っ張っていく姿が印象的だった。


そして個人的に大好きなキャラ・兎。普段はほんわかしているんだけど、密教系の新興宗教の信者で事あるごとに怪しげな真言を唱え出すというこちらもなかなか尖ったアイドル。宗教のせいでいじめられたという辛い過去を持ってるけど普段は表に出さない強さ、そしてそんな自分に変わらずに接してくれるリセとみつきを大切に思っているところとか、イメージに反して唄が上手いところとか、ほんわかしてるだけじゃなくて言葉の裏に隠された女同士のファイティングもしっかり理解してる現実にシビアなとことか、リセのことを本気で心配する優しさとか、あとスタイルとかいいところずくめで本当にかわいい。かわいいかわいいかわいい。

本筋とは関係ないんだけど教養の講義で宗教論をとったり、たいていの人が神を信仰してるアメリカに行ったりしてから宗教に対する見方がある程度変わったんだけど、新興宗教の信者ってことを単なるネタとして扱うだけじゃなくて掘り下げてくれて、当人にとっては大事なものというふうにリセが兎ちゃんの信仰を尊重してくれてたところが私的にポイント高かった。


全体を貫く「芸能界は汚い世界なのか?」というテーマにも利生の中ではしっかり決着がつけられていて、とてもよかったと思う。


あおいと利生は最後にやり取りをかわしてこの恋には一区切りついたわけだけど、みつきの利生へのフラグが立ちかけたり、ちょくちょく登場する利生の幼馴染・小春にも何か伏線がありそうで、続きがとても楽しみな作品だった。2巻出てくれ。


個人的にはリセと兎の絡みをもっと見てみたいなあ。スタイルがいい2人がくっついていると本当に最高だし兎はリセに助けてもらってリセ好き好きになってるしリセは兎のスタイルにドキドキするからこの2人が密着してたら両方にメリットあるし世界平和では??  (百合厨でごめんなさい)


あらすじを見たときは女装男子ものかと思ってワクワクしていたんだけど、その期待がいい意味で裏切られたのでよかった。読者を振り回す展開の面白さとか筆力とか、とても実力のある作者さんだと感じた。


岩関先生の既刊、タイトル聞いたことなかったんだけどこれからチェックしたい。

私がいかに打算的であるか

 学科の人間との会話の中で考えたことを書き留めておこうと思う。

 以下、死ぬほどどうでもいい自己省察が続くことに留意したほうがいいと思うよ。

 

 きょうY氏との会話の中で「私はまったく打算的な人間で、クズである」という旨の発言をした。たった3時間ほど前の事なのにどんな文脈でそんな発言をしたのかは覚えていない。唯一確かなのはY氏はあきらかにその意味を理解出来ていない様子で、そしてそのまま話題が変わってしまったということだ。別に私は自分語りをすることに執着があるわけではない。ただなんとなく会話が終わった後もこの命題を反芻して思考を続けてしまったので、せっかくだから考えたことについて書き残しておこうかなと思ってこの文章を書いている。

 

 私が今学期書いたノートのほとんどは学科のSlackにアップされている。Y氏やほかの人間が私のノートを借りて撮った写真をアップしたのだ。Y氏はどうやらそれが私の善性(?)によるものだと考えているようで、だから冒頭の発言がピンとこなかったのだと思う。けれど実際はまったくそんなことはない。ノートが結果的にあがっているのは、私にとってノートをあげるかあげないかなんて心底どうでもいいことだからだ。そう、ほんとうにどうでもよいのだ。誰かが私のノートの写真を参照しようがしまいがどうでもいい。私のノートを使って勉強したことで私よりも良い成績をとったとしても、まったくどうでもいい。それで単位を落とすかどうかの瀬戸際で窮地をまぬかれようが、結局単位を落とそうがそれは私には興味がない。私にとっての不利益が発生しない限り、それは本当に本当にどうでもいい問題であり、拒否する理由は特にない。だからノートを見せてくれと言われても断らない。私はたまに学内でやっている献血のお願いに対し、「面倒だから」という怠惰な理由で協力しないわけだが、もし目の前で交通事故が発生してB型の血液が必要です、とか面と向かって言われたらおそらく断らないだろう。そうなれば断るほうが面倒なことになるし、血が500㏄程度減ったところでとくに健康上の不具合はないからだ。

 

 これだけなら別に標準的な善でも悪でもない人間なのであろうが、ここからもう少し話は続く。私は他人の利益になりうる行動をとっているとき、大抵は心底どうでもいいなあと考えながらそうした行動をとる。ところが、そうやって興味がない風を装っておきながら、そのとき必ず「この行動によって相手に何か要求できるだろうか?」という方向に思考を向けている。あるいは、「この行動によって私はなにかを獲得/喪失する可能性があるだろうか?」ということを必ず考えている。私はノートをアップして相手がお礼を言ってくるそのとき、「ああ、これで私が困っているときに快く助けてもらえるかもしれないな」または「これによって他人の頭の中で私の評価が少しあがるのかなあ、いや、むしろ便利なやつとして利用される可能性もあるかもしれないぞ」と考えながら、どういたしまして、なんて素知らぬ顔で言っているわけだ。これは私がまったく打算的であることの証左ではないだろうか?

 

 他人が私の事を打算的と考えないのは、私が表立って相手に何かを要求することが(今のところ)ないからだ。それは単純にノートを見せただけで何かを要求するのはあまりにもあつかましくて馬鹿らしいことであるということでもあるし、現在の私には欲しいものがあまりないということでもある。正確に言えば、他人(ノートの場合はそれを利用した学科の人間)が持っているもので、ノートと同じくらいの価値を持っていて、かつ私が欲しているものがないということだ。突飛な例ではあるが、もし私が交通事故に遭って今にも失血死しそうな石油王に対して血液を提供したなら、そのあとで躊躇せずそれなりの(たぶん数十万円くらいの)金額を要求するであろう。なぜならその主体(石油王)はそれを提供でき、またそのような緊急性のある状況では血液はそのくらいの価値を持つからで、そして私は好きなアニメのDVD(響け! ユーフォニアムというアニメはとても面白いのでみんな観ようね)や漫画(群青にサイレンという漫画はとても面白いので(ry)を好きなだけ買い集めるためにそれくらいの金が欲しいと常々考えているからだ。

 

 何が言いたいのかというと、私は日常のこまごまとした出来事においてもその対価についていつも考えている人間で、また私は必要なものが有る場合には躊躇なくある種の冷酷さをもってまで対価を要求する人間で、そして今は運よく私が何もほしいものがないからそういう行動に出ていないというだけなのだ。つまり私は打算的なクズであるということだ。大人になるにつれて家を買いたいとか金がもっとほしいとかそういう欲求が出てくるものだと聞いているので、おそらく私はまったく碌な大人にならないことだろう。

 

 私になにかを提供されたみんな! 

 私は無関心なふりを装って肚の中ではそういうことを常に考えているぞ! 

 

 ちなみにもう少し事実を正確に申告すると、わたしは現在「響け! ユーフォニアム」を他人に布教したがっているし、語り合える人間を欲している。「群青にサイレン」、「ななしのアステリズム」という漫画も他人に貸してもっと読んでもらいたい、内容について話したい、と常々考えている。

 

 あーあ、ノートを使った人間が対価としてユーフォを1話だけでも観てくれたり、群青にサイレンを1巻だけでも私から借りにきたりしてくれないかなあ。

 

 もちろんノートを使ってない人にもよろこんで貸すので、声をかけてほしい(もう学期終わっちゃうけど)。