【C言語】構造体内の領域解放(free)の仕方
教えてGoo運営側に内容チェックされているため再度内容を変更し質問させていただきます。
http://okwave.jp/qa/q8080757.html
(ダンプを書いたのがまずかったかもしれないので、ここでは削除します。)
<プログラムで実行したいこと>
・簡単なリストを作成
・リストを構成する構造体のメンバはchar*などのメンバがあり、
特に、char*にstrdupにて文字列をコピーする。(正確には文字列のポインタをコピーする。)
・作ったリストをプリントする。
・領域を確保する。
下記のソースで動くと思ったのですが、領域のfreeでうまくいきません。
どうもない領域をfreeしているようなのです。それがなぜかわかりません。
*** glibc detected *** ./a.out: free(): invalid pointer: 0x00000000020eb030 ***
どうしたら、解決するのか、どこが悪いのかご指摘いただけないでしょうか。
以下、私が書いたソースになります。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct word {
struct word *next;
char *st;
int *line_no;
int line_cnt;
};
struct word *head;
void Add_List(char *buf,int no){
struct word* node = malloc(sizeof(struct word*));
struct word* crnt;
/*nodeの準備*/
node->next = NULL;
//node->st = strdup(buf);
node->st = malloc(sizeof(char)*10);
strcpy(node->st,buf);
node->line_no = malloc(sizeof(int*));
node->line_no[0] = 1;
node->line_cnt= 1;
if(head == NULL) {
head = node;
} else {
crnt = head;
while( crnt->next != NULL) {
crnt = crnt->next;
}
crnt->next = node;
}
}
void printlist(){
struct word *crnt = head;
while( crnt != NULL ) {
printf("%s\n",crnt->st);
crnt = crnt->next;
}
}
int main(){
head = NULL;
char buf1[] = {'A','B','C','D','E','\0'};
char buf2[] = {'F','G','H','I','J','\0'};
char buf3[] = {'K','L','M','N','O','\0'};
Add_List(buf1,1);
Add_List(buf2,1);
Add_List(buf3,1);
printlist();
/*この部分がうまくいかない*/
printf("%s\n",head->st);
printf("%x \n",head->st);
free(head->st);
/*********************/
}
お礼
ありがとうございます。 私は素人で詳しいことは分かりません。詳しく教えていただいたのですが、単にMIPSアセンブラで記述するとどうなるかを知りたいのです。