ポインタの理解はまだまだと痛感
教則本のサンプルを書いていると大いにはまります。
ちょっとはまっていた事が、自分の中で解決したのでメモしておきます。
まずエラー(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言語では、標準エラーみても、意味不明というところでしょうか……。
そろそろデバッガ使えるようになった方がいいのかな〜。