ポインタの理解はまだまだと痛感

教則本のサンプルを書いていると大いにはまります。



ちょっとはまっていた事が、自分の中で解決したのでメモしておきます。



まずエラー(Segmentation falt)する場合

 

#include<stdio.h>

#include <string.h>

struct linked_list {

    struct linked_list *next;

    char *data;

};

int main(void);

int main(){

   

    struct linked_list new_item;

   

    char item[4] = "abc";

    strcpy(new_item.data, item);    /* ここでSegmentation falt */

    printf("%s\n", new_item.data);

    return(0);

}

 

#stcpyでエラーになるわけですが、最初はこれがさっぱり意味分からず・・・^^;



色々考えたら分かったわけでさっそく回答編



#include<stdio.h>

   

struct linked_list {

    struct linked_list *next;

    char *data;

};

int main(void);

int main(){

   

    struct linked_list new_item;

   

    char item[4] = "abc";

    new_item.data = item;    //ポインタの代入

    printf("%s\n", new_item.data);

    return(0);

}



 

分かって見ればなんということはないですが、失敗パターンでは、

new_item.data には、ポインタは宣言したものの、実際の何かしらの変数のアドレスが代入されていないのです。

アドレスが割り当たっていないのに、そこに対して値をコピーしようとしたら、それは無理、ということで、エラーになるわけですねー。

    strcpy(new_item.data, item); 



上手い事動く方は、変数を宣言し(つまりアドレスが割り当たる)、その変数のアドレスを代入しているので、OKとなるわけです。

この後、サイズさえ間違えなければ、strcpyは動いたりするわけです。

    char item[4] = "abc"; //変数の宣言。言い換えるならば、アドレスの確保

    new_item.data = item;    //アドレスを代入

    strcpy(new_item.data, ”def”);  //動きます



いやー勉強になりました。

デバックして恐ろしいと感じたのは、phpとかのようなヌルイ言語とは違って、C言語では、標準エラーみても、意味不明というところでしょうか……。



そろそろデバッガ使えるようになった方がいいのかな〜。